C# Google.ProtocolBuffers 反序列化方法 (proto3)
C# Google.ProtocolBuffers Deserialization Method (proto3)
我最近升级了我的代码库(Java、C++ 和 C#)以使用 proto3。对于 C#,这涉及对代码进行 2000 多次更改。这主要是语义上的,一切都很好,但有一个问题我似乎无法理解; serialization/deserialization。我有以下修改后的方法来反序列化我的 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);
}
}
但是 MessageParser parser = new MessageParser();
行给我一个 design/compile-time 错误
MessageParser does not contain a constructor that contains 0 aguments
好吧,据我所知,proto3 documents 告诉我的情况恰恰相反。
我只想知道如何使用 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();
}
}
这样可以编译,但是对吗?
对于你的反序列化编译时错误,documentation 告诉你 你应该将 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);
}
}
正如documentation所说,序列化应该没问题。
我最近升级了我的代码库(Java、C++ 和 C#)以使用 proto3。对于 C#,这涉及对代码进行 2000 多次更改。这主要是语义上的,一切都很好,但有一个问题我似乎无法理解; serialization/deserialization。我有以下修改后的方法来反序列化我的 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);
}
}
但是 MessageParser parser = new MessageParser();
行给我一个 design/compile-time 错误
MessageParser does not contain a constructor that contains 0 aguments
好吧,据我所知,proto3 documents 告诉我的情况恰恰相反。
我只想知道如何使用 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();
}
}
这样可以编译,但是对吗?
对于你的反序列化编译时错误,documentation 告诉你 你应该将 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);
}
}
正如documentation所说,序列化应该没问题。