现在这两个方法都在构造函数被调用之前被调用
不,顺序是:
在执行任何构造函数之前如何调用(非静态)方法?
因为它欺骗和撒谎;它不使用构造函数创建对象;不完全是。它用于FormatterServices.GetUninitializedObject
分配香草空白空间。然后,如果有一个自定义的反序列化构造函数,它会在该对象的顶部调用构造函数。讨厌。像这样,基本上:
var obj = FormatterServices.GetUninitializedObject(typeof(MyClass));
var ctor = obj.GetType().GetConstructor(
BindingFlags.Instance | BindingFlags.Public| BindingFlags.NonPublic,
null,
new[] { typeof(SerializationInfo), typeof(StreamingContext) },
null);
ctor.Invoke(obj, new object[2]);
IMO 他们可能应该在ISerializable
界面上将此作为第二种方法,但无论出于何种原因:他们没有。真的很遗憾:这会使它更诚实,并避免人们需要记住实现自定义构造函数。
示例输出:
.ctor: MyClass
> serializing
OnSerializingMethod: MyClass
GetObjectData: MyClass
OnSerializedMethod: MyClass
< serializing
> deserializing
OnDeserializingMethod: MyClass
.ctor: MyClass
OnDeserializedMethod: MyClass
< deserializing
示例代码:
using System;
using System.IO;
using System.Runtime.CompilerServices;
using System.Runtime.Serialization;
using System.Runtime.Serialization.Formatters.Binary;
[Serializable]
class MyClass : ISerializable
{
public MyClass() { Trace(); }
protected MyClass(SerializationInfo info, StreamingContext context) { Trace(); }
public void GetObjectData(SerializationInfo info, StreamingContext context) { Trace(); }
void Trace([CallerMemberName] string caller = null)
{
System.Console.WriteLine("{0}: {1}", caller, GetType().Name);
}
[OnDeserializing()]
internal void OnDeserializingMethod(StreamingContext context) { Trace(); }
[OnDeserialized()]
internal void OnDeserializedMethod(StreamingContext context) { Trace(); }
[OnSerializing()]
internal void OnSerializingMethod(StreamingContext context) { Trace(); }
[OnSerialized()]
internal void OnSerializedMethod(StreamingContext context) { Trace(); }
static void Main()
{
using (var ms = new MemoryStream())
{
var orig = new MyClass();
var ser = new BinaryFormatter();
System.Console.WriteLine("> serializing");
ser.Serialize(ms, orig);
System.Console.WriteLine("< serializing");
ms.Position = 0;
System.Console.WriteLine("> deserializing");
ser.Deserialize(ms);
System.Console.WriteLine("< deserializing");
}
}
}