如何扩展可序列化的类,以便它仍然可以序列化?

时间:2010-12-21 22:12:30

标签: c# asp.net viewstate page-state

我有一个这样的类,我想在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 个答案:

答案 0 :(得分:3)

您应该能够将Serializable标记放在MyListClass上,这将导致ExtraData被序列化为自己的字段。

答案 1 :(得分:0)

请参阅PageStatePersister Class上的文档,这是ASP.NET最近处理ViewState的方式。特别是,请参阅ObjectStateFormatter Class,这是IStateFormatter界面的默认实现。

从该文档中可以看出,任何可以使用BinaryFormatter序列化的类都可以正常工作。