2010-03-04 3 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를 사용하여 개체를 serialize하는 것입니다.

+0

'DataContractSerializer'는 XML을 생성하고 읽습니다. XML은 바이너리가 아닙니다. – picrap

0

이것이 이진 직렬화의 원칙입니다. [Serializable] 클래스 만 직렬화 할 수 있습니다 (그러나이 제한이 최근에 해제되었음을 읽었을 수도 있음). 직렬화 프로세스를 제어하려면 ISerializable을 구현하십시오.

룸 클래스에 직렬화 할 수없는 멤버가 있으면 ISerializable도 필요합니다.

Room 멤버는 무엇입니까?

+0

: 당신은 직렬화 및 datacontract하는 클래스를 가질 수 없습니다 동시에. 런타임에 예외가 throw됩니다. – agnieszka

+0

맞습니다. 나는 그 질문을 오해했습니다. – Timores

+0

Room 클래스의 사본을 보유 할 수 있습니까? 예를 들어 RoomProxy와 같은 멤버가 직렬화 가능하지만 DataContract에는 포함되어 있지 않습니까? 중복을 피하기 위해 [DataContract]로 표시되지 않은 Room의 하위 클래스가있을 수 있습니다. ISerializable을 구현하여 직렬화 할 수 있습니다. – Timores

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"); 
} 
관련 문제