Estoy escribiendo un prototipo de conexión TCP y tengo problemas para homogeneizar los datos que se enviarán.
Por el momento, no estoy enviando nada más que cadenas, pero en el futuro queremos poder enviar cualquier objeto.
El código es bastante simple en este momento, porque pensé que todo podría convertirse en una matriz de bytes:
void SendData(object headerObject, object bodyObject)
{
byte[] header = (byte[])headerObject; //strings at runtime,
byte[] body = (byte[])bodyObject; //invalid cast exception
// Unable to cast object of type 'System.String' to type 'System.Byte[]'.
...
}
Por supuesto, esto se resuelve fácilmente con un
if( state.headerObject is System.String ){...}
El problema es que, si lo hago de esa manera, necesito verificar CADA tipo de objeto que no se pueda convertir a un byte [] en tiempo de ejecución.
Como no conozco todos los objetos que no se pueden convertir en un byte [] en tiempo de ejecución, esto realmente no es una opción.
¿Cómo se convierte un objeto en una matriz de bytes en C # .NET 4.0?
FileStream
o cualquier objeto que encapsule un identificador como ese).Respuestas:
Usa el
BinaryFormatter
:Tenga en cuenta que
obj
y todas las propiedades / campos dentroobj
(y así sucesivamente para todas sus propiedades / campos) deberán etiquetarse con elSerializable
atributo para ser serializados con éxito con esto.fuente
using
bloque, ya que liberará con entusiasmo el búfer interno utilizado.consulte este artículo: http://www.morgantechspace.com/2013/08/convert-object-to-byte-array-and-vice.html
Usa el siguiente código
fuente
MemorySteam
debe estar envuelto en unusing
bloque.Como otros han dicho antes, podría usar la serialización binaria, pero puede producir bytes adicionales o deserializarse en objetos con datos no exactamente iguales. Usar la reflexión por otro lado es bastante complicado y muy lento. Hay otra solución que puede convertir estrictamente sus objetos a bytes y viceversa: la clasificación:
Y para convertir bytes en objeto:
Es notablemente más lento y en parte inseguro utilizar este enfoque para objetos pequeños y estructuras en comparación con su propio campo de serialización por campo (debido a la doble copia desde / a la memoria no administrada), pero es la forma más fácil de convertir estrictamente el objeto en byte [] sin implementar la serialización y sin atributo [Serializable].
fuente
StructureToPtr
+Copy
es lento? ¿Cómo puede ser más lento que la serialización? ¿Hay alguna solución más rápida?var bytes = new byte[size];
Lo que estás buscando es la serialización. Hay varias formas de serialización disponibles para la plataforma .Net
byte[]
fuente
Puedes usarlo como el siguiente código.
fuente
Usar
Encoding.UTF8.GetBytes
es más rápido que usarMemoryStream
. Aquí, estoy usando NewtonsoftJson para convertir el objeto de entrada a una cadena JSON y luego obtengo bytes de la cadena JSON.Punto de referencia para la versión de @Daniel DiPaolo con esta versión
fuente
Clase de soluciones combinadas en extensiones:
fuente
Puede utilizar las herramientas de serialización integradas en el marco y serializar en un MemoryStream . Esta puede ser la opción más sencilla, pero puede producir un byte más grande [] que el estrictamente necesario para su escenario.
Si ese es el caso, podría utilizar la reflexión para iterar sobre los campos y / o propiedades en el objeto a serializar y escribirlos manualmente en el MemoryStream, llamando a la serialización de forma recursiva si es necesario para serializar tipos no triviales. Este método es más complejo y llevará más tiempo implementarlo, pero le permite mucho más control sobre la secuencia serializada.
fuente
¿Qué tal algo simple como esto?
fuente
Prefiero usar la expresión "serialización" que "convertir en bytes". Serializar un objeto significa convertirlo en una matriz de bytes (o XML u otra cosa) que se pueda usar en el cuadro remoto para reconstruir el objeto. En .NET, el
Serializable
atributo marca tipos cuyos objetos se pueden serializar.fuente
Manera alternativa de convertir objeto a matriz de bytes:
fuente
Una implementación adicional, que utiliza JSON binario Newtonsoft.Json y no requiere marcar todo con el atributo [Serializable]. Solo un inconveniente es que un objeto tiene que estar envuelto en una clase anónima, por lo que la matriz de bytes obtenida con la serialización binaria puede ser diferente de esta.
La clase anónima se usa porque BSON debe comenzar con una clase o matriz. No he intentado deserializar el byte [] de vuelta al objeto y no estoy seguro de si funciona, pero he probado la velocidad de conversión al byte [] y satisface completamente mis necesidades.
fuente
¿Qué tal la serialización? Echa un vistazo aquí .
fuente