【发布时间】:2020-04-07 11:24:25
【问题描述】:
当我尝试反序列化自引用对象时抛出异常。
System.Runtime.Serialization.SerializationException: "链接地址信息中引用了ID为1的对象,但该对象不存在。"
这是我的代码:
class MySerializationSurrogate : ISerializationSurrogate {
public void GetObjectData(object obj, SerializationInfo info, StreamingContext context) {
Console.WriteLine("MySerializationSurrogate.GetObjectData()");
}
public object SetObjectData(object obj, SerializationInfo info, StreamingContext context, ISurrogateSelector selector) {
Console.WriteLine("MySerializationSurrogate.SetObjectData()");
var it = info.GetEnumerator();
while (it.MoveNext()) {
Console.WriteLine($"{it.ObjectType} {it.Name} {it.Value}");
}
return obj;
}
}
[Serializable]
class Test {
int prop { get; set; } = 123321;
Test me { get; set; }
public Test() { me = this; }
}
class Program {
static void Save() {
BinaryFormatter bf = new BinaryFormatter();
FileStream fs = new FileStream("E:\\a.txt", FileMode.Create);
Test ch = new Test();
bf.Serialize(fs, ch);
fs.Close();
}
static void Read() {
BinaryFormatter bf = new BinaryFormatter();
SurrogateSelector mss = new SurrogateSelector();
mss.AddSurrogate(typeof(Test), bf.Context, new MySerializationSurrogate());
bf.SurrogateSelector = mss;
FileStream fs = new FileStream("E:\\a.txt", FileMode.Open);
object ch = bf.Deserialize(fs);
fs.Close();
}
static void Main(string[] args) {
Save();
Read();
Console.ReadLine();
}
}
我的控制台中没有任何输出,所以我认为
SetObjectData()和GetObjectData()没有被调用。如果我删除
mss.AddSurrogate(typeof(Test), bf.Context, new MySerializationSurrogate());,代码将成功运行。如果我删除
Test.me,代码将成功运行。我试图找出问题所在,所以我创建了一个这样的循环引用:
a.p=b;b.p=a;序列化(fs,a);
然后反序列化,没有任何异常。所以支持循环引用。
似乎当你使用用户定义的代理并尝试反序列化具有自指针的对象时,会抛出异常。
连你的代理人都没有被召唤。
那怎么了?
【问题讨论】:
-
我想运行您的代码,这样我就可以看到您所看到的相同内容 - 您有
MySerializationSurrogate代码吗?另外,我并不是要“成为那个人”,而是:我真的,真的,真的建议反对BinaryFormatter,在任何情况下:blog.marcgravell.com/2020/03/… -
MySerializationSurrogate在代码块的顶部,您只需要添加一些导入即可。 @MarcGravell -
可能异常信息有点不同,我用谷歌翻译翻译成英文。
-
哦,原来如此;我一定是向下滚动的!看着
-
如果您将代理配置代码从
Read复制到Save,一切正常——这就是这里缺少的吗?
标签: c# .net serialization binaryformatter binary-serialization