Сериализация классов для «почти» XML-строк в C # - PullRequest
2 голосов
/ 23 мая 2011

Можно / нужно использовать XmlSerialiser для де / сериализации следующего, определенного третьей стороной, протокола сообщений, который «похож» на xml?

Протокол определяет количество сообщений, некоторые из которых содержат атрибуты, а другие нет, например. Протокол А

  • Сообщение GetEvent должно быть передано в виде строки <GetEvent></GetEvent>
  • Сообщение AckEvent должно быть передано с двумя параметрами в виде строки <AckEvent>1234,888</AckEvent>

Я хотел бы использовать XDocument для выполнения де / сериализации в / из классов (в идеале классы должны быть сгенерированы из файла xsd), например

class GetEvent{}
class AckEvent{int ID; int Type;}

Но классы без атрибутов сериализуются с закрывающим тегом 'minimized': <GetEvent />, который не разрешен протоколом.

Кроме того, у того же стороннего устройства есть другой интерфейс, который немного отличается тем, что атрибуты должны быть заключены в теги, например. Протокол Б:

Сообщение SomeOtherEvent с параметрами будет передано в виде строки <SomeOtherEvent><ID>1234</ID><TYPE>999</TYPE></SomeOtherEvent>

Я могу сериализовать их, используя:

public static XDocument Serialize<T>(T source)
{
    XDocument target = new XDocument();

    XmlSerializer s = new XmlSerializer(typeof(T));
    System.Xml.XmlWriter writer = target.CreateWriter();

    XmlSerializerNamespaces ns = new XmlSerializerNamespaces();
    ns.Add("", "");

    s.Serialize(writer, source, ns);

    writer.Close();
    return target;
}

Но все еще есть проблема минимизированного закрывающего тега для сообщений без параметров.

  • Как указать, что атрибуты протокола A должны быть сериализованы как значения, разделенные запятыми, а не заключены в теги?
  • Как я могу указать, что закрывающий тег «не минимизирован» используется для сообщений без параметров для любого из протоколов?
  • Подходит ли использование платформы XmlSerialisation для вышеперечисленного или недостаточно XML? Если нет, то какой будет самый простой и чистый подход?

Ответы [ 2 ]

0 голосов
/ 23 мая 2011

.Net XML классы могут работать только с правильно сформированным XML. Если эта «XML-подобная» схема не является правильно сформированной, вам придется свернуть свою собственную.

Эта статья в Википедии содержит некоторые основные правила о правильном формировании. Полное определение см. В спецификации .

.
0 голосов
/ 23 мая 2011

Попробуйте использовать атрибут XmlElement .

...