我可以使用 protobuf-net 在 Mono 中序列化一个对象(包含成员:​​字典、列表...等)并在 MS.NET 中反序列化它,反之亦然?

Posted

技术标签:

【中文标题】我可以使用 protobuf-net 在 Mono 中序列化一个对象(包含成员:​​字典、列表...等)并在 MS.NET 中反序列化它,反之亦然?【英文标题】:Can I serialize an object (containing members: Dictionary, List... etc) in Mono and deserialize it in MS.NET or vice versa by using protobuf-net? 【发布时间】:2012-09-19 23:29:06 【问题描述】:

我有一个在 MS.NET 上运行的服务器和一个在 Mono 上运行的客户端(这是一个 Unity3D 引擎),当我尝试 BinaryFormatter().Deserialize 这样的对象时:

   [Serializable]   
    public class Simulator  
    
        public IDictionary<int, Task> tasks = new Dictionary<int, Task>(); 

客户端找不到/加载类型:字典、列表... 在 MS.NET 下运行的相同“客户端代码”运行良好,即在反序列化期间没有任何异常。

正如我从http://www.mono-project.com/FAQ:_Technical#Compatibility 看到的,这是一个常见问题:

“如果您正在序列化自己的类,则没有问题,因为您可以控制用于序列化的程序集和类。 但是,如果您从框架中序列化对象,则不能保证序列化兼容性,因为这些对象的内部结构可能不同。这种兼容性甚至无法保证在不同的 MS.NET 版本或 Mono 版本之间。”

ProtoBuf-Net 是否有助于避免/解决这个序列化/反序列化问题?

【问题讨论】:

【参考方案1】:

是的,诸如 protobuf-net 之类的外部序列化工具可以解决这个问题 - 事实上,一旦您在平台之间进行序列化(C++ 到 java 到 python 到 .net),框架版本就不再那么重要了。

所以是的:在 .NET 上加载时,在单声道/统一的 protobuf-net 中序列化的数据完全兼容。但是,应该注意的是,BinaryFormatter 和 protobuf-net 不是直接的 1:1 等价物 - 每个都有略微不同的特性和行为。例如,protobuf-net 不会遍历事件/委托,并且通常不能很好地处理仅称为“对象”的事物。但是,完全支持字典和列表等关键/常见场景。

【讨论】:

以上是关于我可以使用 protobuf-net 在 Mono 中序列化一个对象(包含成员:​​字典、列表...等)并在 MS.NET 中反序列化它,反之亦然?的主要内容,如果未能解决你的问题,请参考以下文章

我可以重复使用对象实例来避免使用 protobuf-net 进行分配吗?

如何在 xamarin ios pcl 中使用 protobuf-net

需要在运行时确定哪些类型 protobuf-net 可以序列化/反序列化

我可以使用 Protobuf-net 对已用 Java 序列化的数据进行反序列化吗?

是否可以在 Silverlight 中使用 protobuf-net 对私有属性进行(反)序列化?

我可以为 Protobuf-net 设置一个全局对象工厂吗?