当我尝试反序列化自引用对象时抛出异常。
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,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),new MySerializationSurrogate());
,代码将成功运行。如果我删除
Test.me
,代码将成功运行。我试图找出问题所在,因此创建了一个循环引用,如下所示:
a.p = b; b.p = a;序列化(fs,a);
然后反序列化,没有任何例外。因此支持循环引用。
似乎当您使用用户定义的代理并尝试反序列化具有自指针的对象时,将引发异常。
即使您的代理人没有被呼叫。
那怎么了?