2011-11-03 5 views
1

List <ICustomClass>をxmlにシリアル化しますか?私は、次のコードファイルを持っている

public interface IMod 
{ 
    string Name { get; set; } 
    string Description { get; set; } 
    bool Enabled { get; set; } 
    List<IClassFile> ClassFiles { get; set; } 
} 
public interface IClassFile 
{ 
    string Path { get; set; } 
    string FileName { get; set; } 
    bool Enabled { get; set; } 
} 
public class ClassFile : IClassFile 
{ 
    public string Path { get; set; } 
    public string FileName { get { return System.IO.Path.GetFileName(Path); } } 
    public bool Enabled { get; set; } 

    .... 
} 
public class ZippedMod : IMod 
{ 
    public string Name { get; set; } 
    public string Description { get; set; } 
    public bool Enabled { get; set; } 
    public List<IClassFile> ClassFiles { get; set; } 

    .... 
} 
public class ConfigurationBlock 
{ 
    public List<IMod> Mods { get; set; } 

    .... 
} 

私のプログラムの過程を通じて、私はConfigurationBlockに数ZippedMod秒を追加し、今私はそれらをシリアル化します。私がやってみました:

using (var stream = new StreamWriter("config.xml")) 
{ 
    var ser = new XmlSerializer(typeof(ConfigurationBlock)); 
    ser.Serialize(stream, configBlock); 
} 

をしかし、私はこのエラーを取得:

There was an error reflecting type 'MinecraftModManager.ConfigurationBlock'. 
|-Inner Exception: 
     Cannot serialize member 'MinecraftModManager.ConfigurationBlock.Mods' of type 'System.Collections.Generic.List`1[[MinecraftModManager.IMod, MinecraftModManager, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]]', see inner exception for more details. 
     |-Inner Exception: 
      Cannot serialize member MinecraftModManager.ConfigurationBlock.Mods of type MinecraftModManager.IMod because it is an interface. 

ヘルプ?

答えて

2

インターフェイスが抽象的であるため、インターフェイスをシリアル化できません。具象型の多くは同じインタフェースを実装できるので、あいまいさが生じます。具体的なタイプを使用する必要があります。

+0

しかし、私はインターフェイスを使用する必要があります。そうしないと、プログラム全体が動作しません。 – Entity

+0

@TheAdamGaskinsインターフェイスは純粋な仮想メソッドを持つ抽象基本クラスにすぎません。なぜ抽象基底クラスを上回るインターフェースでなければならないのですか? –

+0

ああ、あなたが「具体的なタイプを使用しなければならない」ということを誤解していました。しかし、抽象クラスへのインタフェースを変更すると、すべてが魔法のように修正されます...? – Entity

0

インターフェイスをシリアル化することはできません。既定のXmlSerializerで具体的なクラスのみをシリアル化できます。この動作を無効にするにはIXmlSerializableを実装できます。

関連する問題