为什么格式化程序是二进制格式化程序,它无法正确处理IDeserializationCallback



假设我们有以下代码:

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(。

但事实并非如此,它看起来像是先调用FirstTypeOnDeserialization方法,然后调用SecondTypeOnDeserialization方法。但它不应该是另一种方式吗?SecondTypeOnDeserialization方法应该首先调用,因为它必须首先执行这个方法,然后才能被视为完全"调用";反序列化的";

那么,格式化程序是不是太笨了,以至于不知道调用每个对象的OnDeserialization方法的正确顺序?

那么格式化程序是不是太笨了,以至于不知道调用每个对象的OnDeserialization方法的正确顺序?

这不是愚蠢的问题;顺序是未定义-这是因为当使用BinaryFormatter时很容易获得循环,所以所能保证的是IDeserializationCallback的各种回调将在整个图的常规反序列化代码之后发生-这里的意图是使得";"父";样式对象可以应用与";"孩子";数据如果父母和孩子都有IDeserializationCallback回调,那么:这听起来是个坏主意,但我想你可以跟踪";它完成了吗;在字段中(老实说,我不会——我只是从内部对象中删除回调(。

最新更新