2010-11-14 11 views
6

Quindi ho un server e un client che comunicano i vari dati indietro e il quarto. Inizialmente avevo un metodo complicato che passava attraverso l'array di byte e convertiva tutte le sue variabili e stringhe, una per una, in quello che avrebbero dovuto essere. Ho imparato ho potuto mettere tutte le variabili in un oggetto e convertirlo in un array di byte utilizzandoConvertire un oggetto in un array di byte in C#, inviarlo su un socket, quindi riconvertire in oggetto

private static byte[] ObjectToByteArray2(Object obj) 
    { 
     if (obj == null) 
      return null; 
     BinaryFormatter bf = new BinaryFormatter(); 
     MemoryStream ms = new MemoryStream(); 
     bf.Serialize(ms, obj); 
     return ms.ToArray(); 
    } 

E riconvertirlo usando

private static Object ByteArrayToObject(byte[] arrBytes) 
    { 
     MemoryStream memStream = new MemoryStream(); 
     BinaryFormatter binForm = new BinaryFormatter(); 
     memStream.Write(arrBytes, 0, arrBytes.Length); 
     memStream.Seek(0, SeekOrigin.Begin); 
     Object obj = (Object)binForm.Deserialize(memStream); 
     return obj; 
    } 

Il problema è che, una volta che mando questo array di byte in tutta la rete a un'altra applicazione, non posso semplicemente usare questo metodo per riconvertirlo, ottengo l'errore "Impossibile trovare assembly 'test1s, versione = 1.0.0.0, Culture = neutral, PublicKeyToken = null'." test1s è solo il nome del piccolo programma server che ho creato per giocare con questo. Ovviamente l'applicazione ha bisogno di alcune informazioni aggiuntive per riconvertire questo array in un oggetto, quindi c'è un modo per farlo, o sto andando sul problema sbagliato?

Quello che voglio ottenere qui è avere un oggetto di nient'altro che più variabili e stringhe, convertirlo in una matrice di byte, inviarlo a un'altra applicazione e convertirlo nuovamente nell'oggetto. In questo modo non devo giocare con l'array di byte per estrarre tutte le mie variabili e stringhe.

Grazie

+0

Se fossi in te, userei un debugger per provare a capirlo. A meno che tu non creda che un debugger sia la madre di tutti i mali. Se non sai cosa intendo, scarica questo: http://stackoverflow.com/questions/602138/is-a-debugger-the-mother-of-all-evil – YWE

risposta

8

Ci sono una miriade di librerie di serializzazione pre-rollate che aiuteranno qui. BinaryFormatter ha alcune caratteristiche indesiderate (IMO) qui - in particolare funzionerà solo con la stessa identica (beh, praticamente) dll ad entrambe le estremità.

XmlSerializer, DataContractSerializer e JavaScriptSerializer sono buone implementazioni basate su testo, e funzionerà bene con una compatibile contratto su entrambe le estremità (stesse proprietà, ecc - non necessariamente dello stesso tipo/versione).

Se si hanno esigenze di larghezza di banda moderate o si richiedono prestazioni CPU migliori, raccomanderei protobuf-net (avvertenza: l'ho scritto) che è un serializzatore binario veloce che può essere d'aiuto.

4

Ciò funzionerà se entrambi i lati del canale di comunicazione hanno un riferimento alla esattamente lo stesso montaggio e esattamente la stessa versione di quell'assemblea, sia fatto riferimento dal programma in qualche modo o che vivono in GAC.

Se si desidera un meccanismo più tollerante rispetto alle corrispondenze di versione, si consiglia di utilizzare invece XMLSerializer (ma notare che l'aggiunta/rimozione/modifica nei campi/proprietà può comportare un comportamento errato se le versioni non corrispondono).

Se è necessario un formato compatto, è possibile considerare l'aspetto Google Protocol Buffers.

1

Se si invia un elenco di stringhe (o un dittico di stringhe) è ciò che si desidera che non sia un problema, è sufficiente inviare una lista (o dict) di stringhe. Il tuo problema deriva dal fatto che stai tentando di inviare un tipo di dati che l'altro progetto non riconosce. Non hai nemmeno bisogno di cambiare nessuna delle tue funzioni, hai solo bisogno di cambiare ciò che invii. In alternativa è possibile fare riferimento a test1s dal programma che riceve i dati.

0

Scrivere il proprio oggetto da/a convertitore di byte anziché utilizzare BinaryStream dovrebbe funzionare.

Se si insiste, spostare questo oggetto sul proprio assieme e aggiungerlo a entrambi i lati come riferimento. In questo modo, .NET Framework dovrebbe essere in grado di de/serializzare l'oggetto.

Problemi correlati