假设我们有以下代码:
static void Main(string[] args) {
var firstType = new FirstType(new SecondType(2021));
var stream = new MemoryStream();
BinaryFormatter formatter = new BinaryFormatter();
formatter.Serialize(stream, firstType);
stream.Position = 0;
var firstTypeReturned = (FirstType)formatter.Deserialize(stream);
Console.WriteLine(firstTypeReturned.numFromSecondType);
}
[Serializable]
class FirstType : IDeserializationCallback {
public SecondType secondType;
public int numFromSecondType = -1;
public FirstType(SecondType t) {
secondType = t;
}
void IDeserializationCallback.OnDeserialization(Object sender) {
numFromSecondType = secondType.num;
}
}
[Serializable]
class SecondType : IDeserializationCallback {
public int num;
public SecondType(int num) {
this.num = num;
}
void IDeserializationCallback.OnDeserialization(Object sender) {
num = 0;
}
}
产量为2021年。
我希望输出为0,因为从我的peractives来看,FirstType
包含SecondType
对象的字段,因此为了成功取消对FirstType
实例的序列化,必须先对SecondType
进行反序列化,然后将取消序列化的SecondType
无形项分配给FirstType
的字段。因为SecondType
实现了IDeserializationCallback
,所以SecondType
不被认为是"0";反序列化完成";直到其CCD_ 10呼叫。因此,当SecondType
被完全反序列化时,其num
字段为0,然后该SecondType
实例被传递给FirstType
,并且当FirstType
调用其OnDeserialization
时,numFromSecondType
应该为0(因为secondType.num
应该为0(。
但事实并非如此,它看起来像是先调用FirstType
的OnDeserialization
方法,然后调用SecondType
的OnDeserialization
方法。但它不应该是另一种方式吗?SecondType
的OnDeserialization
方法应该首先调用,因为它必须首先执行这个方法,然后才能被视为完全"调用";反序列化的";
那么,格式化程序是不是太笨了,以至于不知道调用每个对象的OnDeserialization
方法的正确顺序?
那么格式化程序是不是太笨了,以至于不知道调用每个对象的
OnDeserialization
方法的正确顺序?
这不是愚蠢的问题;顺序是未定义-这是因为当使用BinaryFormatter
时很容易获得循环,所以所能保证的是IDeserializationCallback
的各种回调将在整个图的常规反序列化代码之后发生-这里的意图是使得";"父";样式对象可以应用与";"孩子";数据如果父母和孩子都有IDeserializationCallback
回调,那么:这听起来是个坏主意,但我想你可以跟踪";它完成了吗;在字段中(老实说,我不会——我只是从内部对象中删除回调(。