看了别人的一段代码,有一段没看懂
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函数也会自动执行?他的代码我没有完全看出来是什么触发的?谢谢!
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函数也会自动执行?他的代码我没有完全看出来是什么触发的?谢谢!
formatter.Serialize(ms, this);
是会自动调用他自己的GetObjectData方法的,我不明白的就是为什么她的成员类也会自动调用GetObjectData方法?因为它没有显示的执行formatter.Serialize()
所以他像一个递归谢谢!
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>();
}
}
[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事件?
改变代码
info.AddValue("1", "asdf");
为info.AddValue("1", new Student2());
这个时候Student2将会自动执行他自己的GetObjectData方法
但是为什么呢,我通过反射的工具察看了一下这个Addvalue方法,没有发现类似于formatter.Serialize()的方法阿?