Обтекание с помощью раздела CData – Сериализация XML C #

Мне нужно сериализовать мой объект таким образом, чтобы свойства, которые я хочу, будут обернуты вокруг разделов CData. Я надеялся, что смогу сделать что-то вроде этого:

public class Order { [JsonProperty] public int OrderId { get; set; } [JsonProperty] public string Name { get; set; } [JsonProperty] public int Type { get; set; } [JsonProperty] public decimal Amount { get; set; } [JsonProperty] public DateTime Date { get; set; } [DataMember] [JsonProperty] **[WrapCData]** public List ListB { get; set; } [DataMember] public List ListC { get; set; } **[WrapCData]** public Product Product { get; set; } } 

Есть ли какой-либо атрибут или реализация, которая могла бы обернуть мои специфические свойства вокруг раздела CData? Существующие ответы StackOverflow указывают на то, что они задействуют сам Entity (Class). Это будет очень грязно.

В следующем streamе: Как вы сериализуете строку как CDATA с помощью XmlSerializer?

Ответ Филипа предлагает сделать другое свойство и соответствующее ему свойство CData. Однако свойство является строкой. CreateCDataSection () также принимает строку. Мне нужно обернуть мои пользовательские объекты / списки вокруг CDataSections. Как я могу это сделать? Любая помощь будет оценена по достоинству. Благодарю.

Пример XML для вышеуказанного classа заказа:

  2 Some Name 1 100 2015-12-07T15:10:49.6031106+05:00 <![CDATA[   OptionValue1 Option1   OptionValue2 Option2   ]]>  ListItem1 ListItem2  <![CDATA[  1 ProductName Product Type  ]]>  

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

 public class Order { [JsonProperty] public int OrderId { get; set; } [JsonProperty] public string Name { get; set; } [JsonProperty] public int Type { get; set; } [JsonProperty] public decimal Amount { get; set; } [JsonProperty] public DateTime Date { get; set; } [DataMember] [JsonProperty] [XmlIgnore] // Do not serialize directly [XmlWrapCData] // Instead include in CDATA nodes public List 

Используя следующие методы расширения и пользовательский атрибут:

 [System.AttributeUsage(System.AttributeTargets.Property, AllowMultiple = false)] public class XmlWrapCDataAttribute : Attribute { public XmlWrapCDataAttribute() { this.Namespace = string.Empty; } public XmlWrapCDataAttribute(string name) : this() { this.Name = name; } public string Name { get; set; } public string Namespace { get; set; } } public static class XmlWrapCDataHelper { static Tuple [] XmlWrapCDataProperties(Type type) { return type.GetProperties() .Where(p => p.GetGetMethod() != null && p.GetSetMethod() != null) .Select(p => Tuple.Create(p, p.GetCustomAttribute())) .Where(p => p.Item2 != null) .ToArray(); } public static XmlNode[] GetCDataContent(object obj) { var index = new object[0]; var properties = XmlWrapCDataProperties(obj.GetType()); return properties.Select(p => (XmlNode)p.Item1.GetValue(obj, index).GetCData(p.Item2.Name ?? p.Item1.Name, p.Item2.Namespace)).ToArray(); } public static void SetCDataContent(object obj, XmlNode [] nodes) { if (nodes == null || nodes.Length < 1) return; var index = new object[0]; var properties = XmlWrapCDataProperties(obj.GetType()).ToDictionary(p => XName.Get(p.Item2.Name ?? p.Item1.Name, p.Item2.Namespace), p => p); var xml = "" + String.Concat(nodes.Select(c => c.Value)) + ""; foreach (var element in XElement.Parse(xml).Elements()) { Tuple pair; if (properties.TryGetValue(element.Name, out pair)) { var value = element.Deserialize(pair.Item1.PropertyType, element.Name.LocalName, element.Name.Namespace.NamespaceName); pair.Item1.SetValue(obj, value, index); } } } } public static class XmlSerializationHelper { public static XmlCDataSection GetCData(this object obj, string rootName, string rootNamespace) { return obj == null ? null : new System.Xml.XmlDocument().CreateCDataSection(obj.GetXml(XmlSerializerFactory.Create(obj.GetType(), rootName, rootNamespace))); } public static XCData GetCData(this object obj, XmlSerializer serializer = null) { return obj == null ? null : new XCData(obj.GetXml(serializer)); } public static string GetXml(this object obj, XmlSerializer serializer = null) { using (var textWriter = new StringWriter()) { var ns = new XmlSerializerNamespaces(); ns.Add("", ""); // Disable the xmlns:xsi and xmlns:xsd lines. var settings = new XmlWriterSettings() { Indent = true, IndentChars = " ", OmitXmlDeclaration = true }; // For cosmetic purposes. using (var xmlWriter = XmlWriter.Create(textWriter, settings)) (serializer ?? new XmlSerializer(obj.GetType())).Serialize(xmlWriter, obj, ns); return textWriter.ToString(); } } public static object Deserialize(this XContainer element, Type type, string rootName = null, string rootNamespace = null) { return element.Deserialize(type, XmlSerializerFactory.Create(type, rootName, rootNamespace)); } public static object Deserialize(this XContainer element, Type type, XmlSerializer serializer = null) { using (var reader = element.CreateReader()) { return (serializer ?? new XmlSerializer(type)).Deserialize(reader); } } public static T DeserializeXML(this string xmlString, XmlSerializer serializer = null) { using (StringReader reader = new StringReader(xmlString)) { return (T)(serializer ?? new XmlSerializer(typeof(T))).Deserialize(reader); } } } public static class XmlSerializerFactory { readonly static Dictionary, XmlSerializer> cache; readonly static object padlock; static XmlSerializerFactory() { padlock = new object(); cache = new Dictionary, XmlSerializer>(); } public static XmlSerializer Create(Type serializedType, string rootName, string rootNamespace) { if (serializedType == null) throw new ArgumentNullException(); if (rootName == null && rootNamespace == null) return new XmlSerializer(serializedType); lock (padlock) { XmlSerializer serializer; var key = Tuple.Create(serializedType, rootName, rootNamespace); if (!cache.TryGetValue(key, out serializer)) cache[key] = serializer = new XmlSerializer(serializedType, new XmlRootAttribute { ElementName = rootName, Namespace = rootNamespace }); return serializer; } } } 

Это позволит успешно проанализировать предоставленный вами XML и взамен генерировать XML, который выглядит так:

  2 Some Name 1 100 2015-12-07T05:10:49.6031106-05:00  ListItem1 ListItem2    ]]> 1 ProductName Product Type ]]> 
  • Почему Java нуждается в интерфейсе Serializable?
  • Отправить форму с помощью AJAX и jQuery
  • Сериализация анонимных делегатов в C #
  • как правильно реализовать Parcelable с ArrayList ?
  • Сериализация XML в Java?
  • Сериализация Java с несериализуемыми частями
  • JSON.NET как сериализатор OAP для WebAPI 2 и ODataMediaTypeFormatter
  • ASP.NET MVC: управление сериализацией имен свойств с помощью JsonResult
  • Весенние сеансовые компоненты (controllerы) и ссылки на службы с точки зрения сериализации
  • Управление несколькими версиями сериализованных объектов Java
  • Сериализация объекта в строку
  • Давайте будем гением компьютера.