Как CData собственности? - PullRequest
0 голосов
/ 20 июля 2011

Как я могу сериализовать свойство с CData?Я пробовал несколько различных методов, включая создание исходного свойства XmlIgnore и введение свойства, которое возвращает XmlCDataSection.Пока ничего не сработало.

У меня есть следующий работающий тест консоли, который показывает ошибку.Как я могу изменить это, чтобы позволить данным Regex сериализоваться и десериализоваться.

using System;
using System.Collections.Generic;
using System.Linq;

namespace ConsoleApplication1
{
    using System.Diagnostics;
    using System.IO;
    using System.Threading;
    using System.Xml;
    using System.Xml.Serialization;

    [Serializable]
    public class MyRegex
    {
        public string Regex { get; set; }
    }
    public static class SerializerHelper<T>
    {
        public static string Serialize(T myobject)
        {
            XmlSerializer xmlSerializer = new XmlSerializer(typeof(T));
            StringWriter stringWriter = new StringWriter();
            xmlSerializer.Serialize(stringWriter, myobject);
            string xml = stringWriter.ToString();

            XmlDocument xmlDoc = new XmlDocument();
            xmlDoc.LoadXml(xml);
            StringWriter sw = new StringWriter();
            XmlTextWriter xw = new XmlTextWriter(sw);
            xmlDoc.WriteTo(xw);

            return sw.ToString();
        }
        public static T DeSerialize(string xml)
        {
            XmlSerializer xmlSerializer = new XmlSerializer(typeof(T));
            StringReader stringReader = new StringReader(xml);
            return (T)xmlSerializer.Deserialize(stringReader);
        }
    }
    class Program
    {
        static void Main(string[] args)
        {
            MyRegex original = new MyRegex { Regex = "\b[1-3]{1}\b#Must be a value of 1 to 3" };
            string xml = SerializerHelper<MyRegex>.Serialize(original);
            Console.WriteLine("--- SERIALIZE ---");
            Console.WriteLine(xml);
            Console.WriteLine();
            Console.WriteLine();


            Console.WriteLine("--- DESERIALIZE ---");
            MyRegex deSerial = SerializerHelper<MyRegex>.DeSerialize(xml);
            Console.WriteLine("Equals? " + (deSerial.Regex.Equals(original.Regex)));

            Console.WriteLine();
            Console.WriteLine();
            Console.WriteLine("Console.ReadKey();");
            Console.ReadKey();
        }
    }
}

Дополнительно: Попытка заменить метод - не работает

    private string _regex;
    public string Regex
    {
        get { return _regex.Replace(@"\\", @"\").Replace("&amp;", "&").Replace("&lt;", "<").Replace("&gt;", ">").Replace("&quot;", "\"").Replace("&apos;", "'"); }
        set { _regex = value.Replace(@"\", @"\\").Replace("&", "&amp;").Replace("<", "&lt;").Replace(">", "&gt;").Replace("\"", "&quot;").Replace("'", "&apos;"); }
    }

1 Ответ

1 голос
/ 20 июля 2011

Вам не нужно использовать CData здесь - проблема в том, что ваш Regex не имеет строки "\ b", у него есть символ \ u0008 (BS) - это не то, что вам нужно в регулярном выражении , Если вы избегаете '\' в инициализации MyRegex, он должен работать:

MyRegex original = new MyRegex { Regex = "\\b[1-3]{1}\\b#Must be a value of 1 to 3" };

Это консольное приложение готово к запуску, и оно корректно сериализует данные (используя \ b):

public class StackOverflow_6755014
{
    public class MyRegex
    {
        public string Regex { get; set; }
    }
    public static class SerializerHelper<T>
    {
        public static string Serialize(T myobject)
        {
            XmlSerializer xmlSerializer = new XmlSerializer(typeof(T));
            StringWriter stringWriter = new StringWriter();
            xmlSerializer.Serialize(stringWriter, myobject);
            string xml = stringWriter.ToString();

            XmlDocument xmlDoc = new XmlDocument();
            xmlDoc.LoadXml(xml);
            StringWriter sw = new StringWriter();
            XmlTextWriter xw = new XmlTextWriter(sw);
            xmlDoc.WriteTo(xw);

            return sw.ToString();
        }
        public static T DeSerialize(string xml)
        {
            XmlSerializer xmlSerializer = new XmlSerializer(typeof(T));
            StringReader stringReader = new StringReader(xml);
            return (T)xmlSerializer.Deserialize(stringReader);
        }
    }
    public static void Test()
    {
        MyRegex original = new MyRegex { Regex = "\\b[1-3]{1}\\b#Must be a value of 1 to 3" };
        string xml = SerializerHelper<MyRegex>.Serialize(original);
        Console.WriteLine("--- SERIALIZE ---");
        Console.WriteLine(xml);
        Console.WriteLine();
        Console.WriteLine();


        Console.WriteLine("--- DESERIALIZE ---");
        MyRegex deSerial = SerializerHelper<MyRegex>.DeSerialize(xml);
        Console.WriteLine("Equals? " + (deSerial.Regex.Equals(original.Regex)));

        Console.WriteLine();
        Console.WriteLine();
        Console.WriteLine("Console.ReadKey();");
        Console.ReadKey();
    }
}
...