1
派生類,實現ISerializable,其基礎類沒有,可以de /序列化基礎類和它自己的成員。在派生類中,FormatterServices.GetSerializableMembers()用於獲取基類的成員,它應該基於MSDN返回字段和屬性。但是,在下面的代碼中,它只返回字段。任何想法?ISerializable派生的類,通過FormatterServices.GetSerializableMembers()在c#
internal static class ISerializableVersioning {
public static void Go() {
using (var stream = new MemoryStream()) {
BinaryFormatter formatter = new BinaryFormatter();
formatter.Serialize(stream, new Derived());
stream.Position = 0;
Derived d = (Derived)formatter.Deserialize(stream);
Console.WriteLine(d);
}
}
[Serializable]
private class Base {
protected String m_name = "base";
protected String Name { get { return m_name; } set { m_name = value; } }
public Base() { /* Make the type instantiable*/ }
}
[Serializable]
private class Derived : Base, ISerializable {
new private String m_name = "derived";
public Derived() { /* Make the type instantiable*/ }
// If this constructor didn't exist, we'd get a SerializationException
// This constructor should be protected if this class were not sealed
[SecurityPermissionAttribute(SecurityAction.Demand, SerializationFormatter = true)]
private Derived(SerializationInfo info, StreamingContext context) {
// Get the set of serializable members for our class and base classes
Type baseType = this.GetType().BaseType;
MemberInfo[] mi = FormatterServices.GetSerializableMembers(baseType, context);
// Deserialize the base class's fields from the info object
for (Int32 i = 0; i < mi.Length; i++) {
// Get the field and set it to the deserialized value
FieldInfo fi = (FieldInfo)mi[i];
fi.SetValue(this, info.GetValue(baseType.FullName + "+" + fi.Name, fi.FieldType));
}
// Deserialize the values that were serialized for this class
m_name = info.GetString("Name");
}
[SecurityPermissionAttribute(SecurityAction.Demand, SerializationFormatter = true)]
public virtual void GetObjectData(SerializationInfo info, StreamingContext context) {
// Serialize the desired values for this class
info.AddValue("Name", m_name);
// Get the set of serializable members for our class and base classes
Type baseType = this.GetType().BaseType;
//**Should GetSerializableMembers return both the field and property? But it only return field here**
MemberInfo[] mi = FormatterServices.GetSerializableMembers(baseType, context);
// Serialize the base class's fields to the info object
for (Int32 i = 0; i < mi.Length; i++) {
// Prefix the field name with the fullname of the base type
object value = ((FieldInfo) mi[i]).GetValue(this);
info.AddValue(baseType.FullName + "+" + mi[i].Name, value);
}
}
public override String ToString() {
return String.Format("Base Name={0}, Derived Name={1}", base.Name, m_name);
}
}
}
它只返回FieldInfo類型的一個元素。 – Pingpong