Сериализировать список <ICustomClass>в xml? - PullRequest
1 голос
/ 03 ноября 2011

У меня есть следующие файлы кода:

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

    ....
}

На протяжении всей моей программы я добавляю несколько ZippedMod s к ConfigurationBlock, но теперь я хочу их сериализовать.Я пытался сделать:

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 ]

2 голосов
/ 03 ноября 2011

Вы не можете сериализовать интерфейс из-за их абстрактной природы. Многие конкретные типы могут реализовывать один и тот же интерфейс, поэтому это создает неоднозначность. Вы должны использовать конкретный тип.

0 голосов
/ 03 ноября 2011

Нельзя сериализовать интерфейс, только конкретный класс со стандартным XmlSerializer. Возможно, вы сможете реализовать IXmlSerializable , чтобы переопределить это поведение.

...