C #Xml-сериализация, коллекция и корневой элемент

Мое приложение сериализует объекты в потоках. Вот пример того, что мне нужно:


  
  

В этом случае объект представляет собой набор объектов «ссылки».

-----------Первая версия

Сначала я использовал DataContractSerializer , однако вы не можете сериализовать элементы как атрибуты (. источник)

Вот объект:

[DataContract(Name="link")]
public class LinkV1
{
    [DataMember(Name="href")]
    public string Url { get; set; }

    [DataMember(Name="rel")]
    public string Relationship { get; set; }
}

И вот результат:


  
    /users
    users
  
  
    /features
    features
  

-----------Вторая версия

Хорошо, не совсем то, что я хочу, поэтому я попробовал классический XmlSerializer , но... о нет, вы не можете указать имя корневого элемента и элементов коллекции, если корневой элемент является коллекцией...

Вот код:

[XmlRoot("link")]
public class LinkV2
{
    [XmlAttribute("href")]
    public string Url { get; set; }

    [XmlAttribute("rel")]
    public string Relationship { get; set; }
}

Вот результат:


  
  
  

-----------Третья версия

используя XmlSerializer + корневой элемент:

[XmlRoot("trick")]
public class TotallyUselessClass
{
    [XmlArray("links"), XmlArrayItem("link")]
    public List Links { get; set; }
}

И его результат:

 
  
    
    
    
  

Хорошо, но мне не нужен этот корневой узел!! Я хочу, чтобы моя коллекция была корневым узлом.

Вот ограничения:

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

Каковы мои решения сейчас:

  1. Кодирование собственного XmlSerializer
  2. Обманывать XmlSerializer, когда он работает с коллекцией (Я пробовал, заставляя его находить XmlRootElement и плюриализовать его для создания собственного XmlRootAttribute, но это вызывает проблемы при десериализации + имя элемента по-прежнему сохраняет имя класса)

Есть идеи ?

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

11
задан Community 23 May 2017 в 12:17
поделиться