Как расширить сериализуемый класс, чтобы он все еще мог быть сериализован? - PullRequest
4 голосов
/ 22 декабря 2010

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

3 голосов
/ 22 декабря 2010

Вы должны просто иметь возможность поместить тег Serializable в MyListClass, что приведет к тому, что ExtraData будет сериализована в качестве собственного поля.

0 голосов
/ 22 декабря 2010

См. Документацию по классу PageStatePersister , именно так ASP.NET обрабатывает ViewState в наши дни. В частности, смотрите ObjectStateFormatter Class , который является реализацией по умолчанию интерфейса IStateFormatter .

Из этой документации видно, что любой класс, который можно сериализовать с помощью BinaryFormatter , должен работать.

...