C # XML-атрибут сериализации перед объявлением класса - PullRequest
2 голосов
/ 26 ноября 2011

У меня есть этот класс

public class dtoObject : CommonBase
{
    [XmlArray("SomeItems"), XmlArrayItem("SomeItem")]
    public List<dtoSomeItem> SomeItems
    {
        get { return _SomeItems; }
        set { _SomeItems = value; }
    }
 }

, и я хотел бы использовать сериализацию XML, чтобы строка XML выглядела так:

<Objects>
    <Object>
        <SomeItems>
            <SomeItem>
              1
            </SomeItem>
            <SomeItem>
              2
            </SomeItem>
        </SomeItems>
    </Object>
    <Object>
        <SomeItems>
            <SomeItem>
              3
            </SomeItem>
            <SomeItem>
              4
            </SomeItem>
        </SomeItems>
    </Object>
</Objects>

Но для жизни яне могу понять, что поставить перед

public class dtoObject

с точки зрения атрибутов, так что я получаю

<Objects><Object>...</Object><Object>...

при сериализации этого.

Есть идеи?

Ответы [ 3 ]

1 голос
/ 26 ноября 2011

Я не думаю, что вы можете сделать это с вашей структурой объектов, потому что XML эффективно объявляет обертку вокруг коллекции SomeItems. Например:

[XmlType("Objects")]
public class dtoObject : CommonBase
{
    [XmlElement("Object")]
    public List<dtoSomeItemWrapper> SomeItemsWrappers
    {
        get { return _SomeItemsWrappers; }
        set { _SomeItemsWrappers = value; }
    }
 }

class dtoSomeItemWrapper
{
    [XmlArray("SomeItems"), XmlArrayItem("SomeItem")]
    public List<dtoSomeItem> SomeItems
    {
        get { return _SomeItems; }
        set { _SomeItems = value; }
    }
}   
1 голос
/ 27 ноября 2011

Вот что я получил на работу. Спасибо comptent_tech и dthorpe за помощь. Я создал свой DTO так:

[XmlType("Object", Namespace = "", TypeName = "Object")]
public class dtoObject : CommonBase   
{       
    [XmlArray("SomeItems"), XmlArrayItem("SomeItem")]       
    public List<dtoSomeItem> SomeItems       
    {
        get { return _SomeItems; }           
        set { _SomeItems = value; }       
    }    
}

Моя функция, которая выполняет сериализацию, такова:

public string ToXML(List<dtoObject> oObject)
{
    XmlDocument xmlDoc = new XmlDocument();
    XmlSerializer xmlSerializer = new XmlSerializer(oObject.GetType(), new XmlRootAttribute("Objects"));
    XmlSerializerNamespaces ns = new XmlSerializerNamespaces();
    ns.Add("", "");

    using (MemoryStream xmlStream = new MemoryStream())
    {

        xmlSerializer.Serialize(xmlStream, oObject, ns);

        xmlStream.Position = 0;
        xmlDoc.Load(xmlStream);
        return xmlDoc.InnerXml;
    }
}

При этом создается формат xml:

<?xml version="1.0"?>
    <Objects>
        <Object>
            <SomeItems>
                <SomeItem>
                </SomeItem>
            </SomeItems>
        </Object>
    <Objects>    
0 голосов
/ 26 ноября 2011

Вам нужно что-то вроде XmlRootAttribute("Object", Namespace="", IsNullable=false) перед объявлением класса.Это говорит XML-сериализатору использовать тег <Object> для представления dtoObject в тексте XML.

Что касается тега <Objects>, вы не получите этого, если не сериализуете массив dtoObject.Это выходит за рамки типа dtoObject.

...