Также на несколько иной ноте можно нибудь объяснить, почему этот атрибут нуждался ?
Позволяет видеть: В процессе сериализации 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 не требуется.
требуется бинарная сериализация? На самом деле наиболее распространенным способом сериализации данных и использования его через приложение Silverlight и страницы ASP.NET является сериализация JSON. –
@zenonych - я не ищу двоичную сериализацию объекта в приложении silverlight. PLS проверить мой вопрос редактирования добавили немного больше информации. –
Я изменил свой ответ, пожалуйста, взгляните на него снова. –