最近、proto3 を使用するようにコード ベース (Java、C++、および C#) をアップグレードしました。C# の場合、これにはコードへの 2000 以上の変更が含まれます。これはほとんどセマンティックであり、すべて問題ありませんが、理解できない問題が 1 つあります。シリアライゼーション/デシリアライゼーション。タイプをデシリアライズするための次の修正されたメソッドがあり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();
は私にデザイン/コンパイル時のエラーを与えています
MessageParser には、引数が 0 のコンストラクターが含まれていません
逆に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();
}
}
これはコンパイルされますが、正しいですか?