没有告诉 Protobuf 网络序列化 System.Object 但仍然出现错误:没有为类型定义序列化程序:System.Object

Posted

技术标签:

【中文标题】没有告诉 Protobuf 网络序列化 System.Object 但仍然出现错误:没有为类型定义序列化程序:System.Object【英文标题】:Protobuf net not told to Serialize a System.Object but still get error: No serializer defined for type: System.Object 【发布时间】:2016-05-11 17:45:28 【问题描述】:

System.InvalidOperationException: "无法为 SomeObject 准备序列化程序 内部异常:"No serializer defined for type: System.Object"

我的代码中是否会出现其他错误?我有很多类要序列化,但我首先测试更简单的类,以确保我的程序正常工作。


也非常重要:SomeObject 被其他类继承(不过,当我收到错误时,我只是在序列化这个基类)


[ProtoContract]
[ProtoInclude(10, typeof(AnotherObject))]
[ProtoInclude(11, typeof(YetAgainObject))]
public class SomeObject 
    [ProtoMember(1)]
    String mName = "";
    [ProtoMember(2)]
    String mOwner = "";
    [ProtoMember(3)]
    String mDesc = "";


[ProtoContract]
public class AnotherObject : SomeObject
    [ProtoMember(1)]
    public object[] someList get; set: 

....

【问题讨论】:

您说您的VObjectType 设置正确。你试过单独序列化吗? 是的,它会序列化但会引发错误。我想到了。我将编辑问题并发布我的答案,这样才有意义。 @Arthur Rey 我完成了我的编辑,措辞更好,我在下面回答了它。 Protobuf 网络继承层次结构没有“堆栈跟踪”,因此即使它是父类,它也会在当前正在序列化的类上引发错误。 【参考方案1】:

在序列化原始对象的过程中,它会检查是否所有的 ProtoInclude 语句。它还检查正确的序列化结构和质量!如果其中任何一个有错误,它会在您尝试序列化的那个中引发错误,但它不会告诉您它来自哪一个,而是说您继承的类导致了错误。

所以谨慎在没有单独检查的情况下进行大量课程时需要注意。对于未定义序列化的对象以外的其他错误也是如此。

因此我的错误出现在 AnotherObject 中,对此的解决方法是:

 [ProtoContract]
 public class AnotherObject : SomeObject
     [ProtoMember(1, DynamicType = true)]
     public object[] someList get; set: 
  

因为你必须告诉它对象包含可序列化的东西(它会信任你)。

【讨论】:

以上是关于没有告诉 Protobuf 网络序列化 System.Object 但仍然出现错误:没有为类型定义序列化程序:System.Object的主要内容,如果未能解决你的问题,请参考以下文章

Unity3D —— protobuf网络框架

教你使用ProtoBuf,通过gRPC服务在Android上进行网络请求

Google protobuf解析消息逻辑的版本问题

Protobuf-net 和 WebApi,使用哪种格式通过网络返回数据?

在 CMake 项目中使用 protobuf

ProtoBuf 没有序列化继承类中的字段[重复]