BinaryFormatter 和反序列化复杂对象
无法反序列化以下对象图。当在 BinaryFormmater 上调用反序列化方法时,会发生该异常: System.Runtime.Serialization.SerializationException:
The constructor to deserialize an object of type 'C' was not found.
C 上有两个构造函数,我认为问题可能是:当序列化 Binaryformatter 使用参数构造函数和反序列化过程时,它需要一个无参数构造函数。有黑客/解决方案吗? Objects :
[Serializable]
public class A
{
B b;
C c;
public int ID { get; set; }
public A()
{
}
public A(B b)
{
this.b = b;
}
public A(C c)
{
this.c = c;
}
}
[Serializable]
public class B
{
}
[Serializable]
public class C : Dictionary<int, A>
{
public C()
{
}
public C(List<A> list)
{
list.ForEach(p => this.Add(p.ID, p));
}
}
// 序列化成功
byte[] result;
using (var stream =new MemoryStream())
{
new BinaryFormatter ().Serialize (stream, source);
stream.Flush ();
result = stream.ToArray ();
}
return result;
// 反序列化失败
object result = null;
using (var stream = new MemoryStream(buffer))
{
result = new BinaryFormatter ().Deserialize (stream);
}
return result;
调用是在同一个环境、同一个线程、同一个方法
List<A> alist = new List<A>()
{
new A {ID = 1},
new A {ID = 2}
};
C c = new C(alist);
var fetched = Serialize (c); // success
var obj = Deserialize(fetched); // failes
Can not deserialize following object graph. That Exception occurs when deserialize method called on BinaryFormmater:
System.Runtime.Serialization.SerializationException :
The constructor to deserialize an object of type 'C' was not found.
There're two constructor on C. and I think the problem may be : While serialization Binaryformatter using the paramatered one and on deserialization process, it needs a parameterless one. Is there a hack / solution?
Objects :
[Serializable]
public class A
{
B b;
C c;
public int ID { get; set; }
public A()
{
}
public A(B b)
{
this.b = b;
}
public A(C c)
{
this.c = c;
}
}
[Serializable]
public class B
{
}
[Serializable]
public class C : Dictionary<int, A>
{
public C()
{
}
public C(List<A> list)
{
list.ForEach(p => this.Add(p.ID, p));
}
}
// Serialization success
byte[] result;
using (var stream =new MemoryStream())
{
new BinaryFormatter ().Serialize (stream, source);
stream.Flush ();
result = stream.ToArray ();
}
return result;
// Deserialization fails
object result = null;
using (var stream = new MemoryStream(buffer))
{
result = new BinaryFormatter ().Deserialize (stream);
}
return result;
The calls are at the same environment, same thread, same method
List<A> alist = new List<A>()
{
new A {ID = 1},
new A {ID = 2}
};
C c = new C(alist);
var fetched = Serialize (c); // success
var obj = Deserialize(fetched); // failes
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
我怀疑您只需要为
C
提供一个反序列化构造函数,因为字典实现了ISerialized
:checked (passes):
I suspect you just need to provide a deserialization constructor to
C
, since dictionary implementsISerializable
:checked (passes):
当您按如下方式实现类 C 时,您的序列化将会成功:
问题是 Dictionary 派生类的序列化。
Your serialization will succeed when you implement class C as following:
The problem is the serialization of the Dictionary derived class.