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); } }
正如文档所说,序列化应该没问题。