Как расширить сериализуемый класс, чтобы он все еще мог быть сериализован?
У меня есть такой класс, который я хочу сохранить в ViewState для asp.net UserControl. Он в основном расширяет общий список несколькими методами, но также добавляет некоторые свойства, например
public class MyListClass: List<MyObject>
{
public string ExtraData;
// some public methods
}
MyObject является сериализуемым, с методами, реализованными следующим образом:
[Serializable()]
class MyObject
{
public MyObject(SerializationInfo info, StreamingContext ctxt)
{
Prop1 = (string)info.GetValue("Prop1", typeof(string));
//...
}
public void GetObjectData(SerializationInfo info, StreamingContext ctxt)
{
info.AddValue("Prop1",Prop1);
}
}
И общие списки по своей природе сериализуемы. ViewState отлично работает с List<MyObject>
но я не могу понять, как реализовать сериализацию для MyListClass.
Интуитивно я хочу сделать что-то вроде этого:
public MyListClass(SerializationInfo info, StreamingContext ctxt)
{
ExtraData= (string)info.GetValue("ExtraData", typeof(string));
this = (List<MyClass>)info.GetValues("BaseList",typeof(List<MyClass>));
}
Очевидно, что это не сработает. Как правильно это сделать?
2 ответа
Вы должны просто иметь возможность поместить тег Serializable в MyListClass, что приведет к тому, что ExtraData будет сериализована как его собственное поле.
См. Документацию по классу PageStatePersister, как ASP.NET обрабатывает ViewState в наши дни. В частности, смотрите класс ObjectStateFormatter, который является реализацией интерфейса IStateFormatter по умолчанию.
Из этой документации видно, что любой класс, который можно сериализовать с помощью BinaryFormatter, должен работать.