Как расширить сериализуемый класс, чтобы он все еще мог быть сериализован?

У меня есть такой класс, который я хочу сохранить в 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, должен работать.

Другие вопросы по тегам