2012-05-03 2 views
0

인터페이스를 직렬화하려고합니다. 이것이 표준 직렬화를 통해 불가능하다는 것을 알고 있습니다. 그래서 기본 클래스에서 사용자 지정 직렬화를 사용했습니다.IXmlSerializer를 사용하여 인터페이스를 직렬화 및 비 직렬화하는 방법은 무엇입니까?

public interface IFoo 
{ 
    object Value { get; } 
} 

public abstract class Foo<T> : IFoo, IXmlSerializable 
{ 
    [XmlElement] 
    public T Value { get; set; } 
    [XmlIgnore] 
    object IFoo.Value { get { return Value; } } 

    XmlSchema IXmlSerializable.GetSchema() { return null; } 
    void IXmlSerializable.ReadXml(XmlReader reader) { throw new NotImplementedException(); } 
    void IXmlSerializable.WriteXml(XmlWriter writer) 
    { 
     XmlSerializer serial = new XmlSerializer(Value.GetType()); 
     serial.Serialize(writer, Value); 
    } 
} 

public class FooA : Foo<string> { } 
public class FooB : Foo<int> { } 
public class FooC : Foo<List<Double>> { } 
public class FooContainer : List<IFoo>, IXmlSerializable 
{ 
    public XmlSchema GetSchema() { return null; } 
    public void ReadXml(XmlReader reader) { throw new NotImplementedException(); } 
    public void WriteXml(XmlWriter writer) 
    { 
     ForEach(x => 
      { 
       XmlSerializer serial = new XmlSerializer(x.GetType()); 
       serial.Serialize(writer, x); 
      }); 
    } 
} 

class Program 
{ 
    static void Main(string[] args) 
    { 
     FooContainer fooList = new FooContainer() 
     { 
      new FooA() { Value = "String" }, 
      new FooB() { Value = 2 }, 
      new FooC() { Value = new List<double>() {2, 3.4 } } 
     }; 

     XmlSerializer serializer = new XmlSerializer(fooList.GetType(), 
      new Type[] { typeof(FooA), typeof(FooB), typeof(FooC) }); 
     System.IO.TextWriter textWriter = new System.IO.StreamWriter(@"C:\temp\demo.xml"); 
     serializer.Serialize(textWriter, fooList); 
     textWriter.Close(); 
    } 
} 

사용자 지정 serialization이 올바르지 않습니다. 순간마다 모든 속성 값을 절약하지만 비 직렬화하려면이 작업을 수행하는 방법을 모릅니다.

아이디어는 Value 속성을 저장하고 fooContainer를 요소로 복구하는 것입니다.

답변

1

디시리얼라이저는 속성 값뿐만 아니라이를 포함하는 개체도 deserialize합니다. 이 오브젝트는 인터페이스이기 때문에 유형이 IMyInterface 일 수 없으므로 인스턴스화 할 수 없습니다. 당신은 그 인터페이스의 구현을 직렬화하고 그것을 deserialize하거나, deserialize 할 인터페이스의 기본 구현을 할당하고자 할 것입니다.

+0

예를 게시하는 데 도움이 될 수 있습니까? 나는 아직 성취하지 못했다. –

관련 문제