2014-05-28 3 views
1

У меня есть класс, который среди других свойств имеет список MyObject.XmlArray Serialization - Как заставить сериализатор игнорировать имя класса элементов в списке?

public class MyClass 
{ 
    ... 

    [XmlArray("OBJECT")] 
    public List<MyObject> Objects { get; set; } 

    ... 
} 

Каждый объект MyObject имеет два свойства: PropA и PropB.

public class MyObject 
{ 
    public string PropA {get;set;} 
    public string PropB {get;set;} 
} 

XML-Serializer возвращает этот XML:

<OBJECT> 
    <MyObject> 
     <PropA>A1</PropA> 
     <PropB>B1</PropB> 
    </MyObject> 
    <MyObject> 
     <PropA>A2</PropA> 
     <PropB>B2</PropB> 
    </MyObject> 
    <MyObject> 
     <PropA>A3</PropA> 
     <PropB>B3</PropB> 
    </MyObject> 
</OBJECT> 

Мои данные требования предназначены для того, чтобы выглядеть следующим образом (я клянусь, она выглядит гораздо менее неправильно, учитывая реальные имена объектов и значений свойств , но независимо от того, это моя задача):

<OBJECT> 
    <PropA>A1</PropA> 
    <PropB>B1</PropB> 
    <PropA>A2</PropA> 
    <PropB>B2</PropB> 
    <PropA>A3</PropA> 
    <PropB>B3</PropB> 
</OBJECT> 

Каков наилучший способ добиться этого? Я попытался объединиться с различными атрибутами Xml (например, XmlArrayItem, XmlElement), но я не могу избавиться от оболочки класса.

Я рассмотрел обычную сериализацию XML, но мне не хотелось выбрасывать всю (рабочую) сериализацию по умолчанию Xml, которая происходит в других свойствах с атрибутом XmlElement для каждого из них.

Любые мысли?

спасибо.

EDIT: Это не дубликат, если вы имеете в виду ссылку, которую рассылаете xDaevax. (XML Serialization - Disable rendering root element of array). Этот вопрос/ответ не спрашивает/не решает, как избавиться от имен классов предметов (теги вокруг каждого элемента в списке), он показывает, как избавиться от общего тега списка, который охватывает весь список элементов. Я хочу точно обратить вспять. Если есть еще одна ссылка на аналогичный, ответный вопрос, я бы с удовольствием узнал. Спасибо.

+0

Я думаю, что это был дан ответ здесь: http://stackoverflow.com/questions/2006482/c-sharp-xml-serialization-disable-rendering-root-element-of-array – xDaevax

+0

К сожалению, нет. Что касается моей проблемы, это решение избавляет от тегов OBJECT, а не тегов MyObject. Однако, спасибо. –

ответ

0

Итак, я сделал что-то очень Hacky, но это работает, и я полагаю, что это все, что имеет значение. Я изменил PropA как int, так как он всегда был числом и использовал следующие теги для настройки специального свойства, которое я хотел использовать для сериализатора XML. Я использовал некоторые предложения Selman22, чтобы сделать это проще. (Спасибо!)

Это решение не будет работать, если, к сожалению, все ваши свойства относятся к одному типу, но он удовлетворяет мои потребности в настоящее время, и мы не предвидим никаких изменений (редко это бывает).

[XmlIgnore] 
public List<MyObject> Objects{ get; set; } 

[XmlArray(ElementName = "OBJECT")] 
[XmlArrayItem(Type = typeof(int), ElementName = "PROPA")] 
[XmlArrayItem(Type = typeof(string), ElementName = "PROPB")] 
public List<object> XmlObjects 
{ 
    get 
    { 
     var xmlObjects = new List<object>(); 

     if (Objects != null) 
     { 
      xmlObjects.AddRange(Objects.SelectMany(x => new List<object> 
      { 
       x.PropA, 
       x.PropB 
      })); 
     } 

     return xmlObjects; 
    } 
    set { } 
} 
3

Если у вас есть коллекция MyObject, вы можете сделать это легко с помощью LINQ to XML:

var xDoc = new XDocument("OBJECT", 
     myObjects 
     .SelectMany(x => new[] 
     { 
      new XElement("PropA", x.PropA), 
      new XElement("PropB", x.PropB) 
     })); 

xDoc.Save("path") 
+0

Мне нравится простота (обязательно люблю LINQ), но я не могу сохранить эту ссылку в пути к файлу, и она по-прежнему теряет остальную часть сериализации свойств, если я пытаюсь ее использовать. –

+0

Пробовал с помощью: [XmlArray ("OBJECT")] общественности Список XmlOjects { получить { возвращать объекты.SelectMany (x => новый список { новый XElement ("PropA", x.PropA), новый XElement ("PropB", x.PropB), }). ToList(); } set {} } Но он просто заменил теги MyObject тегами XElement. –

Смежные вопросы