Проблема с C # XmlSerialization - PullRequest
1 голос
/ 06 декабря 2010

У меня есть XML-файл:

<?xml version="1.0" encoding="utf-8"?>
<LabelTypesCollection xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance="xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <LabelTypes>    
    <LabelType>
      <Name>LabelTypeProduct</Name>
    </LabelType>
    <LabelType>
      <Name>LabelTypeClient</Name>
    </LabelType>    
  </LabelTypes>
</LabelTypesCollection>

И 2 класса c #:

[Serializable]
[XmlRoot("LabelTypesCollection")]
public class LabelTypesCollection
{
    private static string _labelTypesCollectionPath = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), Path.Combine(Program.ProgramName, "LabelTypesCollection.xml"));

    [XmlArray("LabelTypes", ElementName="LabelType")]
    public List<LabelType> LabelTypes { get; set; }

    public static LabelTypesCollection LoadAllLabelTypes()
    {
        FileInfo fi = new FileInfo(_labelTypesCollectionPath);
        if (!fi.Exists)
        {
            Logger.WriteLog("Could not find size_types_collection.xml file.", new Exception("Could not find size_types_collection.xml file."));
            return new LabelTypesCollection();
        }

        try
        {
            using (FileStream fs = fi.OpenRead())
            {
                XmlSerializer serializer = new XmlSerializer(typeof(LabelTypesCollection));
                LabelTypesCollection labelTypesCollection = (LabelTypesCollection)serializer.Deserialize(fs);
                return labelTypesCollection;
            }
        }
        catch (Exception ex)
        {
            Logger.WriteLog("Error during loading LabelTypesCollection", ex);
            return null;
        }
    }
}


[Serializable]    
public class LabelType
{
    [XmlElement("Name")]
    public string Name { get; set; }

    [XmlIgnore]
    public string TranslatedName
    {
        get
        {
            string translated = Common.Resources.GetValue(Name);
            return (translated == null) ? Name : translated;
        }
    }
}

И когда я звоню:

LabelTypesCollection.LoadAllLabelTypes();

Я получаю объект LabelTypeCollection с пустым списком LabelTypes. Там нет ошибки или что-нибудь. Может ли кто-нибудь указать мне на проблему?

Ответы [ 3 ]

2 голосов
/ 06 декабря 2010

Вот предложение.

Напишите небольшую тестовую программу, которая создает экземпляр LabelTypesCollection и добавляет в него несколько LabelType объектов.

Затем используйте от XmlSerializer до записи объекта в файл и посмотрите, какой Xml вы получите, чтобы убедиться, что ваш входной XML находится в правильной схеме.

Возможно, что-то не так с одним из ваших элементов XML.

2 голосов
/ 06 декабря 2010

Измените

[XmlArray("LabelTypes", ElementName="LabelType")]

на

[XmlArray]

ElementName для XmlArrayAttribute задает имя элемента контейнера и являетсясобственно то, что вы указываете в первом параметре ctor!Итак, у вас есть ctor, который говорит: «этот класс сериализуется как контейнер с именем LabelTypes; на самом деле не нужно ждать, я хочу, чтобы контейнер получил имя LabelType».Именованный параметр перезаписывает то, что говорит первый безымянный параметр.

И фактически, поскольку вы хотите, чтобы элемент контейнера был назван LabelTypes, то есть то, что на самом деле называется членом, вам не нужноукажите это вообще.

Возможно, вы подумали о XmlArrayItemAttribute, который управляет именами отдельных членов сериализованной коллекции, но и здесь вам это не нужно.

Мой обычный подход для работы с сериализатором xml заключается в том, чтобы создавать объекты вручную, а затем смотреть на XML, который они сериализуют с до .В этом случае, используя код, который у вас есть в настоящее время, вы получите xml, подобный следующему:

<?xml version="1.0" encoding="utf-16"?>
<LabelTypesCollection xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <LabelType>
    <LabelType>
      <Name>one</Name>
    </LabelType>
    <LabelType>
      <Name>two</Name>
    </LabelType>
  </LabelType>
</LabelTypesCollection>

, что подсказало мне неверный спецификатор LabelType.

Обратите внимание, что вы тожеXmlRoot на LabelTypesCollection или XmlElement на Name, так как вы просто указываете, что в любом случае придет в сериализатор xml.

0 голосов
/ 06 декабря 2010

Я действительно думаю, что вы получите пустой список, потому что ваш код не может найти файл XML. Также попробуйте создать свой список. Если у вас правильно указан путь xml.

public List<LabelType> LabelTypes = new List<LabelType>();
...