看了别人的一段代码,有一段没看懂
public class MyObject : ISerializable 
{
  public int n1;
  public int n2;
  public String str;
  public MyObject()
  {
  }
 
//Persistable attribute是自定义的
[Persistable(Flags = PersistType.InitializeNew, Context = PersistContextStates.ExcludeClipboard)]
private VariableCollection _vc = null;[SecurityPermissionAttribute(SecurityAction.Demand,SerializationFormatter =true)]
  public virtual void GetObjectData(SerializationInfo info, StreamingContext context)
  {
    反射循环所有的属性,如果发现该属性具有Persistable标记,添加到info里面去
  }
}
当然类VariableCollection也具有相同的定义,也实现了ISerializable接口,可是让我奇怪的是当执行完MyObject 的GetObjectData函数后,VariableCollection对象的GetObjectData函数也自动执行了我就是想知道为什么VariableCollection对象的GetObjectData函数也会自动执行?他的代码我没有完全看出来是什么触发的?谢谢!

解决方案 »

  1.   

    反射的时候 如果成员带有Persistable 特性的..值类型的获取值..引用类型的调用GetObjectData的方法了把.
      

  2.   

    其实顶层类MyObject 在序列化的时候
    formatter.Serialize(ms, this);
    是会自动调用他自己的GetObjectData方法的,我不明白的就是为什么她的成员类也会自动调用GetObjectData方法?因为它没有显示的执行formatter.Serialize()
    所以他像一个递归谢谢!
      

  3.   

    要实现 ISerializable,需要实现 GetObjectData 方法以及一个特殊的构造函数,在反序列化对象时要用到此构造函数。在序列化过程中调用 GetObjectData 时,需要填充方法调用提供的 SerializationInfo 对象。只需按名称/值对的形式添加将要序列化的变量。只要已序列化的数据足以在反序列化过程中还原对象,便可以自由选择添加至 SerializationInfo 的成员变量。如果基对象实现了 ISerializable,则派生类应调用其基对象的 GetObjectData 方法。 
      

  4.   

    //空接口
    public interface IJson
    {
    }public static class JsonHelper
    {
        public static string ToJson(this IJson source)
        {
            return ToJson(source, source.GetType());
        }    public static string ToJson(this IJson source, Type type)
        {
            DataContractJsonSerializer serilializer = new DataContractJsonSerializer(type);
            using (Stream stream = new MemoryStream())
            {
                serilializer.WriteObject(stream, source);
                stream.Flush();
                stream.Position = 0;
                StreamReader reader = new StreamReader(stream);
                return reader.ReadToEnd();
            }
        }    public static T ParseJSON<T>(this string str)
        {
            using (MemoryStream ms = new MemoryStream(Encoding.Unicode.GetBytes(str)))
            {
                DataContractJsonSerializer serializer = new DataContractJsonSerializer(typeof(T));
                return (T)serializer.ReadObject(ms);
            }
        }    // 通过JSON序列化深度克隆类型
        public static T DeepClone<T>(this IJson Source) where T : IJson
        {
            string jsonString = Source.ToJson();
            return jsonString.ParseJSON<T>();
        }
    }
      

  5.   

     我换一种方式问
    [SerializableAttribute]
        class SerializeTest : ISerializable
        {
            [Persistable(Flags = PersistType.InitializeNew)]
            private Student2 s = null;        public void testDO()
            {            
                IFormatter formatter = new System.Runtime.Serialization.Formatters.Binary.BinaryFormatter();
                using (MemoryStream ms = new MemoryStream())
                {
                    formatter.Serialize(ms, this);
                }
            }        [SecurityPermissionAttribute(SecurityAction.Demand, SerializationFormatter = true)]
            void ISerializable.GetObjectData(SerializationInfo info, StreamingContext context)
            {
                info.AddValue("1", "asdf");
            }
        }    [SerializableAttribute]
        class Student2 : ISerializable
        {
            void ISerializable.GetObjectData(SerializationInfo info, StreamingContext context)
            {
                int i = 0;
            }
        }代码调用
    SerializeTest asd = new SerializeTest();
    asd.testDO();
    如何能够让Student2 也能自动触发GetObjectData事件?
      

  6.   

    好像我已经解决这个问题了
    改变代码
    info.AddValue("1", "asdf");
    为info.AddValue("1", new Student2());
    这个时候Student2将会自动执行他自己的GetObjectData方法
    但是为什么呢,我通过反射的工具察看了一下这个Addvalue方法,没有发现类似于formatter.Serialize()的方法阿?