Estou escrevendo uma conexão TCP de protótipo e estou tendo problemas para homogeneizar os dados a serem enviados.
No momento, estou enviando nada além de seqüências de caracteres, mas no futuro queremos poder enviar qualquer objeto.
O código é bastante simples no momento, porque eu pensei que tudo poderia ser convertido em uma 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[]'.
...
}
É claro que isso é facilmente resolvido com um
if( state.headerObject is System.String ){...}
O problema é que, se eu fizer dessa maneira, preciso verificar TODOS os tipos de objetos que não podem ser convertidos em um byte [] em tempo de execução.
Como eu não conheço todos os objetos que não podem ser convertidos em um byte [] em tempo de execução, isso realmente não é uma opção.
Como alguém converte qualquer objeto em uma matriz de bytes no C # .NET 4.0?
FileStream
ou qualquer objeto que encapsule um identificador como esse).Respostas:
Use o
BinaryFormatter
:Observe que
obj
todas as propriedades / camposobj
(e assim por diante para todas as suas propriedades / campos) precisarão ser marcados com oSerializable
atributo para serem serializados com êxito.fonte
using
bloco, pois ele libera ansiosamente o buffer interno usado.confira este artigo: http://www.morgantechspace.com/2013/08/convert-object-to-byte-array-and-vice.html
Use o código abaixo
fonte
MemorySteam
pacote deve ser embrulhado em umusing
bloco.Como outros já disseram, você pode usar a serialização binária, mas pode produzir bytes extras ou ser desserializado em objetos com dados não exatamente iguais. Usar a reflexão, por outro lado, é bastante complicado e muito lento. Existe uma outra solução que pode converter estritamente seus objetos em bytes e vice-versa - marshalling:
E para converter bytes em objeto:
É visivelmente mais lento e parcialmente inseguro usar essa abordagem para objetos e estruturas pequenos, comparando seu próprio campo de serialização por campo (devido à cópia dupla de / para memória não gerenciada), mas é a maneira mais fácil de converter estritamente objeto em byte [] sem implementar serialização e sem o atributo [Serializable].
fonte
StructureToPtr
+Copy
é lento? Como pode ser mais lento que a serialização? Existe alguma solução mais rápida?var bytes = new byte[size];
O que você está procurando é serialização. Existem várias formas de serialização disponíveis para a plataforma .Net
byte[]
fonte
Você pode usá-lo como abaixo do código.
fonte
Usar
Encoding.UTF8.GetBytes
é mais rápido que usarMemoryStream
. Aqui, estou usando o NewtonsoftJson para converter o objeto de entrada em string JSON e, em seguida, obtendo bytes da string JSON.Referência para a versão de @Daniel DiPaolo com esta versão
fonte
Classe Soluções combinadas em extensões:
fonte
Você pode usar as ferramentas internas de serialização na estrutura e serializar para um MemoryStream . Essa pode ser a opção mais direta, mas pode produzir um byte maior [] do que o estritamente necessário para o seu cenário.
Se for esse o caso, você pode utilizar a reflexão para iterar sobre os campos e / ou propriedades no objeto a ser serializado e gravá-los manualmente no MemoryStream, chamando a serialização recursivamente, se necessário, para serializar tipos não triviais. Esse método é mais complexo e levará mais tempo para implementar, mas permite muito mais controle sobre o fluxo serializado.
fonte
Que tal algo simples assim?
fonte
Prefiro usar a expressão "serialização" do que "converter em bytes". Serializar um objeto significa convertê-lo em uma matriz de bytes (ou XML ou outra coisa) que pode ser usada na caixa remota para reconstruir o objeto. No .NET, o
Serializable
atributo marca os tipos cujos objetos podem ser serializados.fonte
Maneira alternativa de converter objeto em matriz de bytes:
fonte
Uma implementação adicional, que usa o JSON binário Newtonsoft.Json e não exige a marcação de tudo com o atributo [Serializable]. Apenas uma desvantagem é que um objeto precisa ser agrupado em uma classe anônima, portanto a matriz de bytes obtida com a serialização binária pode ser diferente desta.
A classe anônima é usada porque o BSON deve começar com uma classe ou matriz. Eu não tentei desserializar o byte [] de volta ao objeto e não tenho certeza se ele funciona, mas testei a velocidade da conversão em byte [] e satisfaz completamente minhas necessidades.
fonte
E a serialização? dê uma olhada aqui .
fonte