Moo*_*ght 4 c# protocol-buffers deserialization proto3
我最近升级了我的代码库(Java,C++和C#)以使用proto3.在C#的情况下,这涉及对代码的2000多个更改.这大部分是语义的,都很好,但有一个问题我似乎无法理解; 序列化/反序列化.我有以下修改的方法来解除我的IMessage类型(在proto2中执行此操作的代码被注释),这是在GitHub存储库中的示例中显示的代码...
public static T ToObject<T>(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<T>(ms);
}
}
Run Code Online (Sandbox Code Playgroud)
但该行MessageParser parser = new MessageParser();给了我一个设计/编译时错误
MessageParser不包含包含0个aguments的构造函数
好吧,我很好奇,因为我知道proto3文件告诉我相反的情况.
我想知道的是,使用proto3,我如何进行反序列化?
谢谢你的时间.
注意,我的序列化代码是
public static byte[] ToByteArray<T>(this T o) where T : IMessage
{
if (o == null)
return null;
using (MemoryStream ms = new MemoryStream())
{
o.WriteTo(ms);
return ms.ToArray();
}
}
Run Code Online (Sandbox Code Playgroud)
编译,但是对吗?
对于反序列化编译时错误,文档告诉你应该传递Func<T>一个函数工厂来创建T构造函数的实例MessageParser<T>.
它可能是() => new T()一个或更复杂的功能,具体取决于创建消息所需的内容.
完整代码:
public static T ToObject<T>(this byte[] buf) where T : IMessage<T>, new()
{
if (buf == null)
return default(T);
using (MemoryStream ms = new MemoryStream())
{
ms.Write(buf, 0, buf.Length);
ms.Seek(0, SeekOrigin.Begin);
MessageParser<T> parser = new MessageParser<T>(() => new T());
return parser.ParseFrom(ms);
}
}
Run Code Online (Sandbox Code Playgroud)
正如文档所说,序列化应该没问题.