2009-12-16 4 views
1

C# 컨텍스트에서 클래스 B가 Serializable로 표시되어 있고이 클래스로 표시되지 않은 클래스 A를 상속 한 사람이 있습니다. A를 직렬화 가능으로 표시하지 않고 B의 인스턴스를 직렬화하는 방법을 찾을 수 있습니까?.Net 이진 직렬화 상속

+0

클래스 B에서 iSerializable을 구현해야한다고 생각합니다. 클래스 직렬화를 제어 할 수 있습니다. – Lazarus

+0

B를 직렬화하려면 슈퍼 클래스 A의 상태를 직렬화해야합니다. A를 Serializable으로 표시하고 싶지 않은 이유는 무엇입니까? – Onots

+0

A는 편집 권한이없는 다른 프로젝트의 일부입니다 –

답변

0

사용자 정의 직렬화가 작동해야한다고 생각합니다. 즉 ISerializable을 구현합니다. 그래도 좋은 옵션은 아닙니다.

using System; 
using System.IO; 
using System.Runtime.Serialization; 
using System.Runtime.Serialization.Formatters.Binary; 
class A { 
    public int Foo { get; set; } 
} 
[Serializable] 
class B : A, ISerializable { 
    public string Bar { get; set; } 
    public B() { } 

    void ISerializable.GetObjectData(SerializationInfo info, StreamingContext context) { 
     info.AddValue("Foo", Foo); 
     info.AddValue("Bar", Bar); 
    } 
    private B(SerializationInfo info, StreamingContext context) { 
     Foo = info.GetInt32("Foo"); 
     Bar = info.GetString("Bar"); 
    }  
} 
static class Program { 
    static void Main() { 
     BinaryFormatter bf = new BinaryFormatter(); 
     B b = new B { Foo = 123, Bar = "abc" }, clone; 
     using (MemoryStream ms = new MemoryStream()) { 
      bf.Serialize(ms, b); 
      ms.Position = 0; 
      clone = (B)bf.Deserialize(ms); 
     } 
     Console.WriteLine(clone.Foo); 
     Console.WriteLine(clone.Bar); 
    } 
} 

데이터를 저장 하시겠습니까? protobuf-net (BinaryFormatter이 아니라 내가 사용하는 것으로 가정)을 사용하여이 작업을 수행 할 수있는 방법을 생각할 수도 있습니다.

+0

답변 해 주셔서 감사합니다. 예, 정확하게, 저는 BynaryFormatter를 사용하고 있습니다. 필요는 객체의 데이터를 저장하는 것입니다. protobuf-net에 대해서, BinaryFormatter 대신에 그것을 사용하면 어떤 이점이 있습니까? 어떤 예가 있습니까? –

+0

a : 빠르고 작음 (http://code.google.com/p/protobuf-net/wiki/Performance) b : 플랫폼/언어 독립적 (http://code.google.com/p/protobuf/wiki/ ThirdPartyAddOns) c : 메타 데이터 고유하지 않음 (필드 이름 변경, 유형 이동/이름 바꾸기 등 : http://marcgravell.blogspot.com/2009/03/obfuscation-serialization-and.html). 간단한 소개 : http://code.google.com/p/protobuf-net/wiki/GettingStarted –

+0

소개는 상속을 다루지 않으며 protobuf-net의 상속 지원은 사용자 정의이며, 직접 * Java/C++/etc : 데이터를 볼 수는 있지만 상속이 아님 (이봐, 나는 와이어 포맷을 설계하지 않았다 ...) –

1

직렬화 대리를 사용해보세요. Nice article Jeff Richter 저

+0

좋은 메커니즘. 링크 주셔서 감사합니다, 그것은 매우 흥미 롭습니다. –