2015-06-19 7 views
1

Я использую XmlSerializer в C# для сериализации экземпляра класса в xml. По умолчанию, если я сериализовать экземпляр следующего класса:Настроить xml, сгенерированный для экземпляров C#

public class XmlTest 
{ 
    public bool b1; 
} 

поле BOOL представлен как <b1>false</b1> У меня есть конкретное требование, что значение BOOL полей можно представить в виде элементов, как в <false> и <true> вместо текстового контента , У меня одинаковые требования для полей enum.

Я попытался использовать атрибуты, которые управляют сериализацией XML, но не смог найти тот, который соответствует моим требованиям. Я довольно новичок в C# и задавался вопросом, как наилучшим образом достичь этого.

ответ

1

Вы не можете сделать это с помощью XML-сериализатора. Вы можете использовать LINQ to XML вместо:

public XElement Serialize(XmlTest t){ 
    return new XElement("XmlTest", 
         new XElement(t.b1 ? "true" : "false")); 
} 

Один намек на использование LINQ к XML в настройке генерации кода: XElement имеет constructor, что выглядит очень просто:

public XElement(
    XName name, 
    Object content 
) 

но что content параметр может быть almost anything. Это включает в себя

  • Любой тип, который реализует ToString
  • Любой тип, который реализует IEnumerable

Так, например:

XElement xmlTree2 = new XElement("Root", 
    from el in xmlTree1.Elements() 
    where((int)el >= 3 && (int)el <= 5) 
    select el 
); 

может производить

<Root> 
    <Child3>3</Child3> 
    <Child4>4</Child4> 
    <Child5>5</Child5> 
</Root> 
+0

Хм, этот ответ выглядит он ближе к «правильный способ сделать это», чем моя - на самом деле шахта может просто сбросить текст, «истина/ложь», а не создать новый элемент – darkpbj

+0

Это кажется хорошим. Но я думаю, что не указал свой полный вариант использования. Я планирую автоматически генерировать генерации классов C#, экземпляры которых затем могут быть сериализованы в xml. Один из вариантов - иметь метод сериализации в каждом сгенерированном классе и индивидуально обрабатывать каждое поле этого класса. Это звучит не очень хорошо. Лучше, и мой предпочтительный подход будет состоять в том, чтобы иметь общий метод Serialize, который может принимать любой экземпляр в качестве параметра. Затем он может использовать отражение для получения полей класса и в зависимости от их типов, сериализуйте их соответствующим образом. Это звучит разумно? – Paani

+0

Если вы автоматически генерируете классы, вы также сможете автоматически генерировать код сериализации. Я думаю, вы найдете LINQ для XML, чтобы быть хорошо подходящим для этого. –

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