2010-03-04 81 views
6

标记为[DataContract]的类不能同时被ISerializable。好的,那么如何将这种类型的对象序列化为二进制流呢?.NET:如何用属性[DataContract]二进制序列化对象?

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

如果房间不能ISerializable,我不能让它工作。 如何从对象中获取字节数组?

回答

3

解决方案是使用DataContractSerializer来序列化对象。

+0

'DataContractSerializer'生成并读取XML。而XML不是二进制的。 – picrap 2017-02-07 09:41:22

0

这就是二进制序列化的原则:只有[Serializable]类可以被序列化(尽管我可能已经读过这个限制最近被解除了)。 如果您想要控制序列化过程,请实施ISerializable。

如果Room类具有不可序列化的成员,那么您也需要ISerializable。

房间的成员是什么?

+0

因为我已经写了:你不能有一类是可序列化和datacontract与此同时。这会在运行时抛出异常 – agnieszka 2010-03-04 23:13:51

+0

你是对的,我误解了这个问题。 – Timores 2010-03-04 23:29:44

+0

拥有一个Room类的副本是否可以接受?说RoomProxy与同样的成员可序列化但不涉及DataContract? 为了避免重复,可以有一个未标记为[DataContract]的Room的子类;它可以通过实现ISerializable来序列化。 – Timores 2010-03-04 23:36:07

24

代码序列化和使用二进制格式反序列化:

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

用法:

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"); 
} 
相关问题