チェックしましたが、クラスをバイト配列に直接シリアライズし、その後、Marc Gravell の protobuf-net 実装を使用してバイト配列からデシリアライズする方法を確認できないようです。
編集: ストリームを経由せずに byte[] にシリアル化する方法の元の質問は確かに些細なことだったので、質問を変更してコードを提供しました。謝罪いたします。
更新された質問:ジェネリックを処理する必要がなく、代わりにコンストラクターを通過するときにリフレクションを通じてプロパティ「MessageBody」の型を推測する方法はありますか? オブジェクト型をシリアル化できないと思いますよね?現在のソリューションは、新しい Message をインスタンス化するたびに MessageBody の型を渡す必要があるという点で非常に面倒に見えます。これに対するより洗練された解決策はありますか?
私は次のことを思いつきました:
class Program
{
static void Main(string[] args)
{
Message<string> msg = new Message<string>("Producer", "Consumer", "Test Message");
byte[] byteArray = msg.Serialize();
Message<string> message = Message<string>.Deserialize(byteArray);
Console.WriteLine("Output");
Console.WriteLine(message.From);
Console.WriteLine(message.To);
Console.WriteLine(message.MessageBody);
Console.ReadLine();
}
}
[ProtoContract]
public class Message<T>
{
[ProtoMember(1)]
public string From { get; private set; }
[ProtoMember(2)]
public string To { get; private set; }
[ProtoMember(3)]
public T MessageBody { get; private set; }
public Message()
{
}
public Message(string from, string to, T messageBody)
{
this.From = from;
this.To = to;
this.MessageBody = messageBody;
}
public byte[] Serialize()
{
byte[] msgOut;
using (var stream = new MemoryStream())
{
Serializer.Serialize(stream, this);
msgOut = stream.GetBuffer();
}
return msgOut;
}
public static Message<T> Deserialize(byte[] message)
{
Message<T> msgOut;
using (var stream = new MemoryStream(message))
{
msgOut = Serializer.Deserialize<Message<T>>(stream);
}
return msgOut;
}
}
私がやりたいのは、次のようなものです。
Message newMsg = new Message("Producer", "Consumer", Foo); byte[] byteArray = newMsg.Serialize();
および Message msg = Message.Deserialize(byteArray);
(ここで、Deserialize は静的メソッドであり、常に Message 型のオブジェクトに逆シリアル化され、メッセージ本文を逆シリアル化する型を知る必要があるだけです)。