XML сериализация в C # - PullRequest
       1

XML сериализация в C #

1 голос
/ 27 апреля 2011

Мой класс выглядит очень похоже на это:

[Serializable]
class ExampleClass {
    public bool Value { get; set; }
    public string Names { get; set; }
}

Я хотел бы сериализовать это так: для значения == true:

<ExampleClass>
   <Value>
   <Names>SomeName</Names>
</ExampleClass>

и для значения == false:

<ExampleClass>
   <Value/>
   <Names>SomeName</Names>
</ExampleClass>

Как видно из значения == true, мы получаем открывающий тег и без атрибутов. В случае, если значение равно false, мы получаем только закрывающий тег.

Как мне добиться этого с помощью сериализации c #?

Ответы [ 6 ]

2 голосов
/ 27 апреля 2011

Могу ли я спросить , почему вы хотите преднамеренно злоупотреблять библиотеками .NET? Как уже упоминалось, вы запрашиваете недопустимый XML, и большинство классов, которые вы найдете в фреймворке, специально разработаны, чтобы избежать ошибок, таких как несоответствующие теги. Поэтому вероятный ответ: вы не можете .

Кто-то может найти вам лучшее решение, если вы опишите проблему более подробно.

1 голос
/ 27 апреля 2011

Как уже говорили другие, то, что вы просите создать, не является допустимым XML.

Мне когда-то приходилось создавать файл 'xml', в котором в определенном месте был непечатный символ.Конечно, это не XML, но вас все равно могут попросить сделать это.

Допустим, вы не можете схватить людей, указывающих протокол, и вызвать гнев богов XML, чтобы ударитьс молнией.

Если вам нужно создать что-то вроде xml-но-не-совсем, запустите его через стандартный XML-сериализатор в строковую переменную и затем выполните поиск / заменуможет быть вашим лучшим вариантом.Что-то вроде:

XmlSerializer serializer = new XmlSerializer(someobj.GetType());
string asString = null;
using (StringWriter writer = new StringWriter())
{
    serializer.Serialize(writer, someobj);
    asString = writer.ToString();
}
string weirdXml = asString.Replace("<Value>True</Value>","<Value>").Replace("<Value>False</Value>","<Value/>");

(убедитесь, что вы молитесь о прощении богам XML каждый раз, когда компилируете код)

1 голос
/ 27 апреля 2011

Вы, кажется, хотите недопустимый XML.

Никакой инструмент или API не позволят вам сделать это, вам придется написать свой собственный XML, используя TextWriter.

Лучший совет, конечно, , а не , чтобы сделать это.Переосмыслите свое решение.

0 голосов
/ 27 апреля 2011

Ну, как правильно сказали все, что вы пытаетесь сделать в случае значения = true, является недействительным атрибутом.

Вместо этого, поскольку я предполагаю, что вы хотите, чтобы значение-значение присутствовало в XML только тогда, когда оно истинно, добавьте его в качестве атрибута. или скажем, как необязательный атрибут. Который присутствует только тогда, когда значение истинно.

Нравится: Когда истина,

 <ExampleClass value=true>           
 <Names>SomeName</Names>  
 </ExampleClass>

и когда ложно

 <ExampleClass >       
 <Names>SomeName</Names> 
 </ExampleClass>

Вам необходимо добавить следующие атрибуты к свойству в классе:

 [System.Xml.Serialization.XmlAttributeAttribute()]
 [System.ComponentModel.DefaultValueAttribute(false)]

Когда значение элемента / атрибута равно значению по умолчанию, оно не включается в сгенерированный xml!.

Надеюсь, это поможет.

0 голосов
/ 27 апреля 2011

Есть способ сделать это (даже для этого дерьмового протокола, который вы используете):

[XmlIgnore]
public bool Value { get; set; }

[XmlText]
public string ValueString
{
    get
    {
        return Value ? "<Value>" : "<Value/>";
    }
    set
    {

    }
}
0 голосов
/ 27 апреля 2011

У меня такое ощущение, что все, что вы действительно просите, так или иначе - это преобразовать объект в XML, и вам не особо важна реализация интерфейса ISerializable.

Если это так, просто используйте TextWriter и напишите свой текстовый файл в соответствии с вашим объектом.

...