Ich überprüft, aber scheinen nicht zu sehen, wie direkt eine Klasse zu einem Byte-Array serialisieren und anschließend aus einem Byte-Array mit Marc Gravell's Protobuf-Net-Implementierung deserialisieren.Protobuf-net Serialisierung/Deserialisierung
Edit: Ich änderte die Frage und stellte Code zur Verfügung, weil die ursprüngliche Frage, wie man in Byte [] serialisiert, ohne durch Strom zu gehen, zugegebenermaßen trivial war. Entschuldigen Sie.
Aktualisierte Frage: Gibt es eine Möglichkeit, sich nicht mit Generika zu befassen und stattdessen den Typ der Eigenschaft "MessageBody" durch Reflexion abzuleiten, wenn es den Konstruktor passiert? Ich nehme an, ich kann den Objekttyp nicht serialisieren, richtig? Die aktuelle Lösung sieht sehr umständlich aus, da ich jedes Mal, wenn ich eine neue Nachricht instanziiere, den Typ des MessageBody übergeben muss. Gibt es dafür eine schlankere Lösung?
ich kam mit den folgenden:
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;
}
}
Was ich zu bekommen ist etwas, wie:
Nachricht newMsg = new Message ("Producer", "Consumer", Foo); byte [] ByteArray = newMsg.Serialize();
und Nachricht msg = Message.Deserialize (byteArray);
(wobei Deserialize eine statische Methode ist und immer in ein Objekt vom Typ Message deserialisiert wird und nur wissen muss, in welchen Typ der Nachrichtentext deserialisiert werden soll).
nicht Protobuf.net Open-Source? –
Es ist, aber ich möchte nicht die Quelle anpassen, weil ich gerne mit neuen Versionen Schritt halten, ohne nachfolgende Anpassungen vornehmen zu müssen, weil die Bibliothek nur eine sehr kleine Komponente als Teil von viel größeren Projekten ist. –
Ein 'MemoryStream' ist nur ein verkettetes Byte-Array, was ist das Problem, das zu verwenden? –