.NET XmlSerializer: как заменить имя тега xml? - PullRequest
2 голосов
/ 09 марта 2011

Для экспорта некоторых данных мы просто сериализуем объекты .Net, такие как список или коллекция, используя XmlSerializer. Мы используем что-то вроде этого:

public static bool WriteToXMLFile(string fullFileNameWithPath, Object obj, Type ObjectType)
        {
            TextWriter xr = null;
            try
            {
                XmlSerializer ser = new XmlSerializer(ObjectType);
                xr = new StreamWriter(fullFileNameWithPath);
                ser.Serialize(xr, obj);
            }
            catch (Exception ex)
            {
                throw ex;
            }
            finally
            {
                if(xr != null)
                    xr.Close();
            }
            return true;
        }

Для списка типа генерируемый XML-код выглядит следующим образом:

<ArrayOfMyObjects>
    <MyObject>
    //content here
    </MyObject>
</ArrayOfMyObjects>

Но ожидание с другой стороны (получатель этого файла выглядит примерно так:

<MT_MyObjects>
    <MyObject>
    //content here
    </MyObject>
</MT_MyObjects>

Так как я могу изменить ArrayOfMyObjects на MT_MyObjects при сериализации? Я знаю, что это можно сделать с помощью некоторой замены Regx. Но я хотел не трогать выход позже.

Обновление: решение:

Я мог бы решить проблему, наконец, так:

[Serializable]
[XmlRoot("MT_LoadProfile")]
public class LoadProfArray : List<LoadProfile>
{
    //....
}

Ответы [ 3 ]

8 голосов
/ 09 марта 2011

Для сериализации массивов вы можете определить атрибуты, определяющие порядок сериализации объекта. Однако, если объект является списком, вам нужно создать класс и наследовать от него, а затем определить атрибуты:

[XmlRoot("DocumentTypes")]
public class DocumentTypeEntityCollection
{

    [XmlElement("Type")]
    public  List<DocumentTypeEntity> Items { get; set; }
}

Это создаст этот вывод:

<?xml version="1.0" encoding="utf-8" ?>
<DocumentTypes>
  <Type>
    <TypeID>7</TypeID>
   ....
3 голосов
/ 09 марта 2011

В вашем классе украсьте собственность

[XmlArray("MT_MyObjects"), XmlArrayItem(typeof(MyObject))]
2 голосов
/ 10 марта 2011

Пожалуйста, найдите пример ниже: / Step1 / Класс Dummy, чья коллекция должна была быть сериализована

[Serializable]
    public class MyObject
    {
        public string ChildObject1 { get; set; }
        public string ChildObject2 { get; set; }
        public MyObject(string childObject1, string childObject2)
        {
            ChildObject1 = childObject1;
            ChildObject2 = childObject2;
        }
        public MyObject()
        {

        }
    }

/ Step2 / Создайте коллекцию списков и примените XMLRootElement

[XmlRoot("Test")]
    public class MyObjectCollection: List<MyObject>
    {

    }

/ Step3 /

Заполнение класса MyObject данными и сериализация

MyObjectCollection lst = new MyObjectCollection();
            lst.Add(new MyObject("1", "a"));
            lst.Add(new MyObject("2", "b"));
            lst.Add(new MyObject("3", "c"));
            try
            {
                XMLFileAgent.WriteToXMLFile(@"C:\TestLog.xml", lst, lst.GetType());
            }
            catch (Exception ex)
            {
                throw ex;
            }
...