使用继承进行协议缓冲序列化。派生类是空的

时间:2015-03-26 12:07:33

标签: c# .net protocol-buffers protobuf-net

我遇到了奇怪的问题。经过阅读后,我尝试在我的应用程序中部署protobuf-net。类与简单继承绑定。在推测成功序列化之后,我试图反序列化列表,但是protobuf只填充基类!

这里有一些代码:

序列化功能

 private static void serialize<T>(T obj) where T: Log
  { 
    using (var fileStream = 
    new FileStream(fileName, FileMode.Append))
    {
       Serializer.SerializeWithLengthPrefix(fileStream, obj, 
         PrefixStyle.Base128, SerializeTypesDictionary.First(x =>
                              x.Value == obj.GetType()).Key);

    }
  }

反序列化

 private static ArrayList deserialize(string filename)
    {           
        object obj;
        var arr = new ArrayList();
        using (var fileStream = new FileStream(file, FileMode.Open))
        {
            while (Serializer.NonGeneric.TryDeserializeWithLengthPrefix
                  (fileStream, PrefixStyle.Base128, resolver, out obj))
            {
                arr.Add(obj);
            }
        }
        return arr;
    }

和班级

 [ProtoContract(ImplicitFields = ImplicitFields.AllPublic)
 [ProtoInclude(100, typeof(Error))]
 [ProtoInclude(101, typeof(Record))]
 [ProtoInclude(102, typeof(SqlQuery))]
 public class Log
 {...}

 [ProtoContract(ImplicitFields = ImplicitFields.AllPublic)]
 public class Error:Log
 {...}

和其他具有相同结构的

那么,我做错了什么?

P.S。反序列化后,列表包含正确的类(不是基类!所有类在其类型中反序列化),但是使用空字段和基类中的完整字段。

1 个答案:

答案 0 :(得分:0)

问题已经结束。

很抱歉浪费你的时间,如果你浪费了它=)只需忘记其中一个派生类的属性,以及它对别人的影响。