DataContractSerializer: сохранить строковый член, который оказывается необработанным xml?

Я немного не разбираюсь в парадигме DataContract и сталкиваюсь с проблемой десериализации. У меня есть поле в виде строки, но оно содержит xml и не десериализуется правильно. У меня такое ощущение, что DCS рассматривает его как ввод для сериализатора, а не как непрозрачный строковый объект.

Есть ли способ пометить DataMember в коде, чтобы сказать: «Это строка, не обрабатывайте ее содержимое как xml», аналогично XmlIgnore?

Спасибо!


person bwerks    schedule 01.06.2010    source источник


Ответы (3)


Что ж, эквивалент [XmlIgnore] - это просто не ставить [DataMember] на ваше свойство / поле - иначе вы украшаете все с помощью [DataMember].

Но я не понимаю, как вы можете указать DataContractSerializer рассматривать свойство как непрозрачную строку и ничего больше.

Вы можете попробовать создать отдельное свойство, которое добавляет <![CDATA[ перед и ]]> после вашей строки содержимого, и сериализовать это свойство вместо вашего необработанного свойства XML (украсив это новое свойство атрибутом [DataMember]).

Что-то вроде этого:

 public string XmlContent { get; set; }

 [DataMember]
 public string XmlContentSafe 
 { 
    get { return "<![CDATA[" + XmlContent + "]]>"; }
 }

Может, таким образом вы сможете обмануть DCS? (сам никогда не пробовал - просто догадываюсь ....)

person marc_s    schedule 01.06.2010
comment
Да, я полагаю, что XmlIgnore - не совсем то, что я хотел бы сделать, так как я хочу, чтобы поле передавалось, а не сериализовалось. Думаю, я надеялся на уловку с DataMember, чтобы указать, что вы хотите, чтобы член был сериализован в определенный тип. Я все же попробую CData! - person bwerks; 01.06.2010

Оказывается, самый простой способ сделать это - просто преобразовать поле xml, поступающее с сервера sql, в varchar (max) при его извлечении из базы данных.

 CAST(CONVERT(XML,[RawXml],0) AS VARCHAR(MAX)) AS RawXml

В этом случае сериализатор, кажется, игнорирует его по своему желанию. Спасибо за помощь!

person bwerks    schedule 01.06.2010

Есть простой способ сделать это, просто объявите свойство с необработанным XML как XmlElement.

[DataMember]
public XmlElement RawXML { private get; set; }
person Marc Cals    schedule 18.12.2015