2011-11-12 30 views
1

派生类,实现ISerializable,其基础类没有,可以de /序列化基础类和它自己的成员。在派生类中,FormatterServices.GetSerializableMembers()用于获取基类的成员,它应该基于MSDN返回字段和属性。但是,在下面的代码中,它只返回字段。任何想法?ISerializable派生的类,通过FormatterServices.GetSerializableMembers()在c#

MSDN

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); 
     } 
    } 
} 

回答

1

GetSerializableMembers返回的MemberInfo阵列;即使它们可以是EventInfo,MethodBase或PropertyInfo对象,也都将它们全部转换为FieldInfo。

+0

它只返回FieldInfo类型的一个元素。 – Pingpong