2010-03-04 8 views
6

La classe contrassegnata come [DataContract] non può essere ISerializable allo stesso tempo. OK, quindi come posso serializzare questo tipo di oggetto su un flusso binario?.NET: come serializzare in modo binario un oggetto con attributo [DataContract]?

private byte[] GetRoomAsBinary(Room room) 
     { 
      MemoryStream stream = new MemoryStream(); 
      BinaryFormatter bf = new BinaryFormatter(); 
      bf.Serialize(stream, room); 
      return stream.ToArray(); 
     } 

Non riesco a farlo funzionare senza Room iserializable. Come posso ottenere un array di byte dall'oggetto in un altro modo?

risposta

3

La soluzione è utilizzare DataContractSerializer per serializzare l'oggetto.

+0

'DataContractSerializer' genera e legge XML. E XML non è binario. – picrap

0

Questo è il principio della serializzazione binaria: solo le classi [Serializable] possono essere serializzate (sebbene possa aver letto che questa restrizione è stata revocata di recente). Se si desidera prendere il controllo del processo di serializzazione, implementare ISerializable.

Se la classe Room ha membri non serializzabili, sarà necessario anche ISerializable.

Quali sono i membri di Room?

+0

Come ho scritto: non si può avere una classe che è serializzabile e DataContract allo stesso tempo. questo genera un'eccezione in fase di esecuzione – agnieszka

+0

Hai ragione, ho frainteso la domanda. – Timores

+0

È accettabile avere una copia della classe Room, ad esempio RoomProxy con gli stessi membri, serializzabile ma non coinvolta in un DataContract? Per evitare la duplicazione, si potrebbe avere una sottoclasse di Room che non è contrassegnata come [DataContract]; potrebbe essere serializzato implementando ISerializable. – Timores

24

Codice per serializzare e deserializzare utilizzando formattatore binario:

public static class BinarySerializer 
{ 
    public static byte[] Serialize<T>(T obj) 
    { 
     var serializer = new DataContractSerializer(typeof(T)); 
     var stream = new MemoryStream(); 
     using (var writer = 
      XmlDictionaryWriter.CreateBinaryWriter(stream)) 
     { 
      serializer.WriteObject(writer, obj); 
     } 
     return stream.ToArray(); 
    } 

    public static T Deserialize<T>(byte[] data) 
    { 
     var serializer = new DataContractSerializer(typeof(T)); 
     using (var stream = new MemoryStream(data)) 
     using (var reader = 
      XmlDictionaryReader.CreateBinaryReader(
       stream, XmlDictionaryReaderQuotas.Max)) 
     { 
      return (T)serializer.ReadObject(reader); 
     } 
    } 
} 

Usage:

public void TestBinarySerialization() 
{ 
    // Create the person object. 
    Person person = new Person { Name = "John", Age = 32 }; 

    // Serialize and deserialize the person object. 
    byte[] data = BinarySerializer.Serialize<Person>(person); 
    Person newPerson = BinarySerializer.Deserialize<Person>(data); 

    // Assert the properties in the new person object. 
    Debug.Assert(newPerson.Age == 32); 
    Debug.Assert(newPerson.Name == "John"); 
} 
Problemi correlati