C#Google.ProtocolBuffers反序列化方法(proto3)

我最近升级了我的代码库(Java,C ++和C#)以使用proto3。 在C#的情况下,这涉及对代码的2000多次更改。 这主要是语义的,都很好,但有一个问题我似乎无法理解; 序列化/反序列化。 我有以下修改的方法去解除我的IMessage类型(在proto2中执行此操作的代码被注释),这是在GitHub存储库中的示例中显示的代码…

 public static T ToObject(this byte[] buf) where T : IMessage { if (buf == null) return default(T); using (MemoryStream ms = new MemoryStream()) { ms.Write(buf, 0, buf.Length); ms.Seek(0, SeekOrigin.Begin); MessageParser parser = new MessageParser(); return (T)parser.ParseFrom(ms); //ProtoBuf.Serializer.Deserialize(ms); } } 

但是MessageParser parser = new MessageParser();MessageParser parser = new MessageParser(); 给我一个设计/编译时错误

MessageParser不包含包含0个aguments的构造函数

好吧,好奇,因为我知道proto3文件告诉我相反。

我想知道的是,使用proto3,我如何进行反序列化?

谢谢你的时间。


注意,我的序列化代码是

 public static byte[] ToByteArray(this T o) where T : IMessage { if (o == null) return null; using (MemoryStream ms = new MemoryStream()) { o.WriteTo(ms); return ms.ToArray(); } } 

编译,但是对吗?

对于反序列化编译时错误, 文档告诉您应该将Func作为函数工厂传递给MessageParser的构造函数创建T实例

它可能是() => new T()或更复杂的函数,具体取决于创建消息所需的内容。

完整代码:

 public static T ToObject(this byte[] buf) where T : IMessage, new() { if (buf == null) return default(T); using (MemoryStream ms = new MemoryStream()) { ms.Write(buf, 0, buf.Length); ms.Seek(0, SeekOrigin.Begin); MessageParser parser = new MessageParser(() => new T()); return parser.ParseFrom(ms); } } 

正如文档所说,序列化应该没问题。