在C#中,序列化派生类的问题可以通过以下方法解决:
[Serializable]
属性标记派生类,以便在序列化和反序列化时保留类的信息。[NonSerialized]
属性标记不需要序列化的成员,以减少序列化的数据量。GetObjectData
方法,以便在序列化时将派生类的信息一并写入。FormatterServices.GetUninitializedObject
方法创建派生类的实例,并在OnDeserialized
方法中进行必要的初始化操作。以下是一个简单的示例:
[Serializable]
public class BaseClass
{
public int BaseProperty { get; set; }
[NonSerialized]
private string _nonSerializedField;
}
[Serializable]
public class DerivedClass : BaseClass
{
public int DerivedProperty { get; set; }
public override void GetObjectData(SerializationInfo info, StreamingContext context)
{
base.GetObjectData(info, context);
info.AddValue("DerivedProperty", DerivedProperty);
}
protected override void OnDeserialized(StreamingContext context)
{
base.OnDeserialized(context);
DerivedProperty = (int)context.Context;
}
}
在这个示例中,BaseClass
是一个基类,它有一个BaseProperty
属性和一个_nonSerializedField
字段,后者被标记为[NonSerialized]
,因此在序列化时不会被保存。DerivedClass
是一个派生类,它继承自BaseClass
,并且被标记为[Serializable]
,以便在序列化和反序列化时保留类的信息。DerivedClass
还重写了GetObjectData
方法,以便在序列化时将DerivedProperty
属性的值也写入。在反序列化时,OnDeserialized
方法被调用,以便对DerivedProperty
属性进行必要的初始化操作。
领取专属 10元无门槛券
手把手带您无忧上云