没有告诉 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的主要内容,如果未能解决你的问题,请参考以下文章
教你使用ProtoBuf,通过gRPC服务在Android上进行网络请求