Comprobé pero parece que no puedo ver cómo serializar directamente una clase en una matriz de bytes y posteriormente deserializar de una matriz de bytes utilizando la implementación de protobuf-net de Marc Gravell.Serialización/deserialización de Protobuf-net
Editar: Cambié la pregunta y proporcioné el código porque la cuestión original de cómo serializar en byte [] sin tener que pasar por la transmisión era ciertamente trivial. Mis disculpas.
Pregunta actualizada: ¿Hay alguna forma de no tener que tratar con los genéricos y en su lugar inferir el tipo de la propiedad "MessageBody" a través de la reflexión cuando se pasa a través del constructor? Supongo que no puedo serializar el tipo de objeto, ¿correcto? La solución actual parece muy engorrosa porque necesito pasar el tipo del MessageBody cada vez que crea una instancia de un nuevo mensaje. ¿Hay una solución más elegante para esto?
me ocurrió lo siguiente:
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;
}
}
Lo que me gustaría llegar a algo como:
mensaje newMsg = nuevo mensaje ("Productor", "consumidor", Foo); byte [] byteArray = newMsg.Serialize();
y Message msg = Message.Deserialize (byteArray);
(donde Deserializar es un método estático y siempre se deserializa en un objeto de tipo Mensaje y solo necesita saber en qué tipo deserializar el cuerpo del mensaje).
no se Protobuf.net de código abierto? –
Es pero no quiero ajustar la fuente porque me gusta mantener el ritmo con las nuevas versiones sin tener que realizar ajustes posteriores porque la biblioteca es solo un componente muy pequeño como parte de proyectos mucho más grandes. –
Un 'MemoryStream' es solo una matriz de bytes disfrazada, ¿cuál es el problema de usar eso? –