2010-03-04 14 views
6

La clase marcada como [DataContract] no puede ser ISerializable al mismo tiempo. OK, entonces, ¿cómo puedo serializar este tipo de objeto en una secuencia binaria?.NET: ¿Cómo serializar binariamente un objeto con el atributo [DataContract]?

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

No puedo hacer que funcione sin Room being ISerializable. ¿Cómo puedo obtener una matriz de bytes del objeto de otra manera?

Respuesta

3

La solución es utilizar DataContractSerializer para serializar el objeto.

+0

'DataContractSerializer' genera y lee XML. Y XML no es binario. – picrap

0

Ese es el principio de la serialización binaria: solo las clases [serializables] se pueden serializar (aunque puedo haber leído que esta restricción se levantó recientemente). Si desea tomar el control del proceso de serialización, implemente ISerializable.

Si la clase Room tiene miembros no serializables, también necesitará ISerializable.

¿Qué son los miembros de Room?

+0

como he escrito: no se puede tener una clase que es serializable y DataContract al mismo tiempo. esto arroja una excepción en el tiempo de ejecución – agnieszka

+0

Tienes razón, he entendido mal la pregunta. – Timores

+0

¿Es aceptable tener una copia de la clase Room, digamos RoomProxy con los mismos miembros, serializable pero no involucrado en un DataContract? Para evitar la duplicación, se podría tener una subclase de Habitación que no esté marcada como [DataContract]; podría serializarse implementando ISerializable. – Timores

24

Código para serializar y deserializar usando formateador 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); 
     } 
    } 
} 

Uso:

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"); 
} 
Cuestiones relacionadas