Serialization Protobuf网络。基于

Serialization Protobuf网络。基于,serialization,protobuf-net,Serialization,Protobuf Net,假设我们有以下三个类: [ProtoContract] [ProtoInclude(10, typeof(FirstType))] [ProtoInclude(20, typeof(SecondType))] public class Base { [ProtoMember(1)] public int ClassId {get;set;} } public class FirstClass : Base { ... } public class SecondClas

假设我们有以下三个类:

[ProtoContract]
[ProtoInclude(10, typeof(FirstType))]
[ProtoInclude(20, typeof(SecondType))]
public class Base
{
    [ProtoMember(1)]
    public int ClassId {get;set;}
}

public class FirstClass : Base
{
    ...
}

public class SecondClass : Base
{
   ...
}
类Id(在基类中)和匹配子类的类型之间存在关系。比如说,

var obj1 = new FirstClass() {ClassId = 1}
var obj2 = new SecondClass() {ClassId = 2}
现在让我们假设我们已经序列化了这些对象。问题是:通过查看ClassId字段,是否有任何好的方法可以基于类Id值反序列化序列化protobuf?i、 例如,如果Serialized protobuf中classId的值为1,则使用FirstClass对剩余的流字节进行反序列化


谢谢

如果您正在使用ProtoInclude,那么protobuf net已经在考虑使用哪个子类:这就是ProtoInclude的全部要点。在某些情况下,不可能使用继承,在这种情况下,可以通过ProtoReader读取proto流,或者使用只读取该属性的第二个模型,然后重置源并再次读取。这里有一个例子:

谢谢你的回答!还有一个问题:通过ProtoReader读取proto流的方法非常有趣。听起来我可以在反序列化时使用自己的自定义转换器(如Json.Net中的JsonConverter)。在Protobuf net中,是否有任何方法可以传递此类自定义转换器,以便在解除对象隔离时,可以使用该自定义转换器而不是默认转换器?@soleiljy在此上下文中定义“自定义转换器”
ProtoReader
ProtoWriter
是序列化程序在引擎盖下使用的,但是,它们是不可自定义的。只有一种方法可以读取底层流。如果你的意思是“我可以在<代码>ProtoReader上编写自己的引擎”-当然可以:玩得开心。这里有一个自定义
DataTable
序列化程序的示例: