2010-11-20 3 views
0

У меня есть сборка silverlight, на которую ссылается приложение silverlight и приложение ASP.Net.двоичная сериализация типов, определенных в сборке silverlight

В приложении ASP.Net мне нужно сериализовать (двоичные) некоторые экземпляры типов, определенных в сборке silverlight. Кто-нибудь может мне с этим помочь?

Редактировать

Моя проблема заключается в том, что у меня есть узел SilverLight, который используется в silverilght приложения, в приложении asp.net и приложение WinForms, в моем asp.net приложение и WinForms приложение мне нужно сериализуйте типы, определенные в общем silverlight assmebly.

Также на немного другой заметке можно объяснить, почему этот атрибут необходим?

+0

требуется бинарная сериализация? На самом деле наиболее распространенным способом сериализации данных и использования его через приложение Silverlight и страницы ASP.NET является сериализация JSON. –

+0

@zenonych - я не ищу двоичную сериализацию объекта в приложении silverlight. PLS проверить мой вопрос редактирования добавили немного больше информации. –

+0

Я изменил свой ответ, пожалуйста, взгляните на него снова. –

ответ

0

Я использовал нечто, называемое sharp serializer, который способен к бинарным типам сериализации без сериализуемого атрибута.

0

Вы можете использовать #if директивы, чтобы включить атрибуты сериализации (и код) для не-Silverlight сборки:

#if !SILVERLIGHT 
[Serializable] 
#endif 
public class SomeClass 
{ 
} 
+0

Насколько я понимаю, вопрос заключается в следующем: как использовать двоичную сериализацию в приложении Silverlight, а не как избежать использования SerializableAttribute. –

+0

btw он использует сборку silverlight, это означает, что он вообще не может использовать SerializableAttribute. –

+0

Моя проблема в том, что у меня есть сборка silverlight, которая используется приложением silverilght, приложение asp.net и приложение winforms, в моем приложении asp.net и приложении winforms. Мне нужно сериализовать типы, определенные в общем silverlight assmebly. Я не смотрю на реализацию двоичной сериализации в моем приложении silverlight –

1

Также на несколько иной ноте можно нибудь объяснить, почему этот атрибут нуждался ?

Позволяет видеть: В процессе сериализации BinaryFormatter вызывает методы класса FormatterServices. Один из они есть

private static MemberInfo[] InternalGetSerializableMembers(RuntimeType type) 

Этот метод содержит следующий код:

if (!CheckSerializable(type)) 
    { 
     throw new SerializationException(Environment.GetResourceString("Serialization_NonSerType", new object[] { type.FullName, type.Module.Assembly.FullName })); 
    } 

позволяет проверить метод CheckSerializable класса FormatterServices:

private static bool CheckSerializable(RuntimeType type) 
{ 
    return type.IsSerializable; 
} 

Этот код похож на:

Type t = typeof (SomeClass); 
    bool isTypeSerializable = t.IsSerializable; 

В этом примере isTypeSerializable будет true, если класс SomeClass имеет SerializableAttribute. В противном случае - false.
Soo ... Простой ответ: этот атрибут flag, который указывает, что экземпляры класса могут быть сериализованы. Так что это просто нужно и все.

Относительно вашего основного вопроса:
К сожалению, вы не можете напрямую использовать бинарный форматировщик, например, класса, определенного в сборке silverlight.
Один из способов сделать это с помощью прокси-класса.
Пример:
Класс внутри SilverLight сборки:

public class SomeClass 
{ 
    public int IntValue { get; set; } 
    public string StringValue { get; set; } 
    public bool BoolValue { get; set; } 
} 

прокси-класс, который поддерживает сериализации внутри общего .NET assemly со ссылкой на SilverLight сборки:

[Serializable] 
    public class SomeClassProxy 
    { 
     public int IntValue { get; set; } 
     public string StringValue { get; set; } 
     public bool BoolValue { get; set; } 

     public static SomeClassProxy GetSerializableObject(SomeClass silverlightClass) 
     { 
      return new SomeClassProxy 
        { 
         IntValue = silverlightClass.IntValue, 
         StringValue = silverlightClass.StringValue, 
         BoolValue = silverlightClass.BoolValue 
        }; 
     } 

     public static SomeClass DeserializeSilverlightCompatible(Stream stream) 
     { 
      BinaryFormatter formatter = new BinaryFormatter(); 
      SomeClassProxy proxy = formatter.Deserialize(stream) as SomeClassProxy; 

      return new SomeClass 
      { 
       IntValue = proxy.IntValue, 
       StringValue = proxy.StringValue, 
       BoolValue = proxy.BoolValue 
      }; 
     } 
    } 

Так что в вашем осины.чистые или WinForms приложения вы должны работать с прокси-класс:

using(MemoryStream memoryStream = new MemoryStream()) 
     { 
      BinaryFormatter formatter = new BinaryFormatter(); 
          //create instance of silverlight class 
      SomeClass mySilverlightClass = new SomeClass(); 
      mySilverlightClass.IntValue = 555; 
      mySilverlightClass.StringValue = "Hello World!"; 
      mySilverlightClass.BoolValue = true; 

      //<===serialize and take care of silverlight instance 
      formatter.Serialize(memoryStream, SomeClassProxy.GetSerializableObject(mySilverlightClass)); 

      memoryStream.Seek(0, SeekOrigin.Begin); 
      //===>deserialize to silverlight instance 
      SomeClass mySilverlightClassRestored = SomeClassProxy.DeserializeSilverlightCompatible(memoryStream); 
     } 

Так что прокси берет на обоих сериализации и десериализации (после десериализации вы получите экземпляр класса SomeClass, который определен в SilverLight сборки).

Если двоичный форматировщик мягкий rescriction тогда я могу рекомендовать вам использовать XML сериалайзер вместо:

XmlSerializer s = new XmlSerializer(typeof(SomeClass)); 
s.Serialize(memoryStream, mySilverlightClass); 
memoryStream.Seek(0, SeekOrigin.Begin); 
SomeClass restored = s.Deserialize(memoryStream) as SomeClass; 

Это тот случай, SerializableAttribute не требуется.

+0

Моя проблема в том, что у меня есть сборка silverlight, которая используется приложением silverilght, asp.net-приложение и приложение winforms, в моем приложении asp.net и приложении winforms мне нужно сериализовать типы, определенные в общем Silverlight assmebly. я не смотрю на реализацию двоичной сериализации в моем приложении silverlight –

+0

спасибо за ответ, похоже, много работы для простого требования. –

+0

@ Vinay B R Да, это правда :) Но в любом случае мое предложение - не используйте BinarySerialization для SL. Это не естественный способ сериализации/десериализации данных для приложений Silverlight. –

0

Вы можете попробовать мой сериалайзер, который способен перемещать двоичные данные между .NET и Silverlight ... http://whydoidoit.com

Смежные вопросы