我有一个运行在MS.NET上的服务器和一个Mono上的客户端(这是一个Unity3D引擎),当我尝试使用BinaryFormatter()时.反序列化一个这样的对象:
[Serializable]
public class Simulator
{
public IDictionary<int, Task> tasks = new Dictionary<int, Task>();
客户端找不到/加载类型:Dictionary,List …
在MS.NET下运行的相同“客户端代码”工作良好,即在反序列化期间没有任何异常.
正如我从http://www.mono-project.com/FAQ:_Technical#Compatibility读到的,这是一个常见的问题:
“如果要序列化自己的类,则没有问题,因为您可以控制用于序列化的程序集和类.
但是,如果要从框架序列化对象,则无法保证序列化兼容性,因为这些对象的内部结构可能不同.在不同的MS.NET版本或Mono版本之间甚至不保证这种兼容性.“
ProtoBuf-Net是否有助于避免/解决此序列化/反序列化问题?
最佳答案 是的,像protobuf-net这样的外部序列化工具可以解决这个问题 – 实际上,一旦你在平台之间进行序列化工作(从C到java到python到.net),框架版本就不那么重要了.
所以是的:当在.NET上加载时,在mono / unity上的protobuf-net中序列化的数据是完全兼容的.但是,应该注意的是,BinaryFormatter和protobuf-net不是直接1:1的等价物 – 每个都有不同的特征和行为.例如,protobuf-net不会遍历事件/委托,并且通常不会很好地处理仅称为“对象”的事物.但是,完全支持字典和列表等关键/常见方案.