2

假设我们有以下三个类:

[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?即,如果序列化的 protobuf 中的 classId 的值为 1,则使用 FirstClass 反序列化剩余的流字节。

谢谢!

4

1 回答 1

0

如果您正在使用 ProtoInclude,那么 protobuf-net 已经在处理要使用的子类:这就是 ProtoInclude 的全部要点。在某些情况下,无法使用继承,在这种情况下,可以通过 ProtoReader 或使用仅读取该属性的第二个模型来读取原始流,然后重置源并再次读取。这里有一个例子:https ://stackoverflow.com/a/14572685/23354

于 2013-02-14T21:42:06.253 回答