Сериализация C # xml

#c# #.net #xml #xml-serialization #xmlserializer

#c# #.net #xml #xml-сериализация #xmlserializer

Вопрос:

Я сериализуюобъект в xml на c #, и я хотел бы сериализовать

 public String Marker { get; set; }
  

в

 <Marker></Marker>
  

когда строковый маркер не имеет значения.

Теперь я получаю

 <Marker />
  

для Marker == string.Empty и нет узла-маркера для null .
Как я могу это получить?

Комментарии:

1. Я думаю, вам следует подробнее рассказать о том, почему вы хотите это сделать. Семантически две формы не имеют разницы, поэтому, если вы пишете систему, в которой они не взаимозаменяемы, это собьет с толку любого (включая вас самих), кто посмотрит на это в будущем.

2. Почему вас должно волновать, находится ли элемент в краткой или расширенной форме? Это не меняет смысла…

3. Вам просто больше нравится <Marker></Marker> представление или есть техническая причина? Это почти никогда не имеет значения (на самом деле, мне приходит на ум только тег HTML <script> — и это из-за недостатка браузеров).

4. Я знаю, что это не меняет смысла, но анализатор на стороне серверов (old phone central) исключает только расширенные формы.

5. Вы только записываете XML-данные или вам также нужно использовать / читать XML? Если вам нужно только читать, возможно, вам лучше использовать XmlWriter класс.

Ответ №1:

Вы можете легко подавить <Marker> элемент, если Marker свойство равно null. Просто добавьте ShouldSerializeMarker() метод:

 public bool ShouldSerializeMarker()
{
    return Marker != null;
}
  

Он будет вызван автоматически XmlSerializer , чтобы решить, включать элемент в выходные данные или нет.

Что касается использования расширенной формы <Marker> элемента, когда строка пуста, простого способа сделать это нет (вы могли бы, вероятно, написать свой собственный XmlWriter , но это было бы затруднительно). Но в любом случае это не имеет смысла, потому что <Marker /> и <Marker></Marker> имеют точно такое же значение.

Ответ №2:

Если вы хотите иметь закрывающие теги, вам нужно изменить реализацию вашей структуры xml; насколько я понимаю этот раздел сериализации, отдельные закрывающие теги создаются только в том случае, если вы сериализуете «сложный» объект (например, класс), а не «простой» объект (например, строку).

Примером может быть:

 [XmlRoot]
public class ClassToSerialize
{
  private StringWithOpenAndClosingNodeClass mStringWithOpenAndClosingNode;

  [XmlElement]
  public StringWithOpenAndClosingNodeClass Marker
  {
    get { return mStringWithOpenAndClosingNode ?? new StringWithOpenAndClosingNodeClass(); }
    set { mStringWithOpenAndClosingNode = value; }
  }
}

[XmlRoot]
public class StringWithOpenAndClosingNodeClass
{
  private string mValue;

  [XmlText]
  public string Value
  {
    get { return mValue ?? string.Empty; }
    set { mValue = value; }
  }
}
  

Если вы сериализуете этот объект в XML, вы получите:

 <ClassToSerialize><Marker></Marker></ClassToSerialize>
  

Я надеюсь, что это поможет!

Комментарии:

1. Отличная идея, но когда я сериализую, ClassToSerialize я получаю <ClassToSerialize> <Marker /> </ClassToSerialize> . Но в любом случае спасибо.

2. НЕТ, это неверно, потому что Marker представлен как отдельный класс (кстати, этот отдельный класс может быть повторно использован для других строковых свойств, которые должны следовать тому же шаблону)

Ответ №3:

Вы можете использовать IsNullable свойство XMLElementAttribute , чтобы настроить XmlSerializer для генерации XML для вашего null значения.

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

 <Marker></Marker> 
  

это то же самое, что

 <Marker/>
  

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

Комментарии:

1. К сожалению, да… Анализатор на стороне сервера исключает только расширенные формы. Сокращенная форма возвращает ошибку, но когда я вручную отправляю развернутую форму, она работает как по волшебству.

2. Итак, решение после того, как вы напишете файл, заменить все более короткие формы расширенными формами путем циклического просмотра файла.

3. Это хорошая идея. Я назову это своим экстренным планом, если не появится более быстрое решение.

4. @Jonah Тебе нужно было прибегнуть к твоему экстренному плану?