0

インターフェイスをシリアル化しようとしています。これは、標準のシリアライゼーションでは不可能であることを知っています。それが、基本クラスでカスタム シリアライゼーションを使用した理由です。

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

カスタムのシリアル化が正しくありません。現時点では、すべてのプロパティ値を保存していますが、逆シリアル化するには、これを行う方法が本当にわかりません。

アイデアは、プロパティ Value を保存し、要素で fooContainer を回復することです。

4

1 に答える 1

1

デシリアライザーは、プロパティ値をデシリアライズするだけでなく、それらを含むオブジェクトもデシリアライズします。そのオブジェクトはIMyInterfaceインターフェイスであり、インスタンス化できないため、タイプにすることはできません。そのインターフェイスの実装をシリアル化してから逆シリアル化するか、逆シリアル化するインターフェイスの既定の実装を割り当てる必要があります。

于 2012-05-03T21:38:54.160 に答える