Сериализовать объект непосредственно в CData - PullRequest
0 голосов
/ 09 июля 2020

Мне нужно сделать api, где в теле запроса должен быть объект CData. Все работает, за исключением того, что я не могу понять, как сделать мой объект сериализованным в объект CData. Проект написан в. net -framework.

В настоящее время у меня есть следующий код.

C#:

[XmlRoot(ElementName = "DATA")]
public class DATA
{
    [XmlElement(ElementName = "ID")]
    public int ID { get; set; }
    [XmlElement(ElementName = "NAME")]
    public string NAME{ get; set; }
}

[XmlRoot(ElementName = "NewDataSet")]
public class CDataSet
{
    [XmlElement(ElementName = "DATA")]
    public DATA data{ get; set; }
}

Как xml нужно заботиться о:

<![CDATA[
<NewDataSet>
    <DATA>
        <ID>007</ID>
        <NAME>John</NAME>
    </DATA>
</NewDataSet>
]]>

Я могу заставить его работать, выполняя обычную сериализацию, сделав запрос к этой функции:

public static string SerializeObject<T>(this T toSerialize)
{
    XmlSerializer xmlSerializer = new XmlSerializer(toSerialize.GetType());

    using (StringWriter textWriter = new StringWriter())
    {
        xmlSerializer.Serialize(textWriter, toSerialize);
        return textWriter.ToString();
    }
}

Затем вручную добавив части CData вокруг него.

Однако мой босс хочет, чтобы он работал без добавления деталей вручную.

Обратите внимание: я новичок в C#.

Любой шаг в правильном направлении поможет. Спасибо!

1 Ответ

0 голосов
/ 09 июля 2020

Попробуйте следующее:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml;
using System.Xml.Serialization;
using System.IO;

namespace ConsoleApplication8
{
    class Program
    {
        static void Main(string[] args)
        {
            CDataSet data = new CDataSet()
            {
                data = new DATA() { ID = "007", NAME = "John" }
            };
            MemoryStream stream = new MemoryStream();
            XmlWriterSettings settings = new XmlWriterSettings();
            settings.Indent = true;
            XmlWriter writer = XmlWriter.Create(stream, settings);
            XmlSerializer serializer = new XmlSerializer(typeof(CDataSet));
            serializer.Serialize(writer, data);
            writer.Flush();
            writer.Close();
            stream.Position = 0;
            byte[] buffer = new byte[stream.Length];
            stream.Read(buffer, 0, (int)stream.Length);
            string xml = Encoding.UTF8.GetString(buffer);
            string output = string.Format("<![CDATA[\n{0}\n]]>", xml);

        }
    }
    [XmlRoot(ElementName = "DATA", Namespace = "")]
    public class DATA
    {
        private int _ID { get; set; }
        [XmlElement(ElementName = "ID")]
        public string ID {
            get { return _ID.ToString("D3");}
            set{  _ID = int.Parse(value);}
        }
        [XmlElement(ElementName = "NAME")]
        public string NAME { get; set; }
    }

    [XmlRoot(ElementName = "NewDataSet")]
    public class CDataSet
    {
        [XmlElement(ElementName = "DATA")]
        public DATA data { get; set; }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...