2010-03-04 24 views
6

[DataContract] olarak işaretlenen sınıf, aynı anda ISerializable olamaz. Tamam, bu tür bir nesneyi ikili akışa nasıl serileştirebilirim?.NET: [DataContract] özelliğine sahip bir nesneyi ikili hale getirmek nasıl?

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

Oda Yapılandırması olmaksızın çalışamıyorum. Nesneden başka bir byte dizisi nasıl alabilirim?

cevap

3

Çözüm, nesneyi serileştirmek için DataContractSerializer'ı kullanmaktır.

+0

'DataContractSerializer' XML üretir ve okur. Ve XML ikili değil. – picrap

0

Bu, ikili serileştirme ilkesidir: yalnızca [Seri haline getirilebilir] sınıfları serileştirilebilir (ancak bu kısıtlamanın son zamanlarda kaldırıldığını okumamış olabilir). Serileştirme işleminin kontrolünü ele almak istiyorsanız, ISerializable'ı uygulayın.

Oda sınıfı seri hale getirilemeyen üyelere sahipse, ISerializable'a da ihtiyacınız olacak.

Oda üyeleri nelerdir?

+0

: Eğer seri hale getirilebilir ve DataContract olan bir sınıf olamaz aynı zamanda. Bu, çalışma zamanında bir istisna atar – agnieszka

+0

Haklısınız, sorumu yanlış anladım. – Timores

+0

Oda sınıfının bir kopyasının olması kabul edilebilir mi, RoomProxy ile aynı üyeye sahip, serileştirilebilir ancak bir DataContract'a dahil değil midir? Çoğaltmayı önlemek için, [DataContract] olarak işaretlenmemiş bir Oda alt sınıfına sahip olabilir; ISerializable uygulanarak serileştirilebilir. – Timores

24

Kod seri ve ikili biçimlendirici kullanarak serisini:

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); 
     } 
    } 
} 

Kullanımı: i yazdım olarak

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"); 
} 
İlgili konular