2011-07-19 7 views
0

CDataでプロパティをシリアル化するにはどうすればよいですか?私は、元のプロパティXmlIgnoreを作成し、XmlCDataSectionを返すプロパティを導入するなど、いくつかの異なるメソッドを試しました。これまでのところ誰も働いていません。CDataプロパティへの方法?

エラーを表示する以下の実行可能コンソールテストがあります。 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

を動作していないあなたは、ここでのCDataを使用する必要はありません - 問題は、あなたの正規表現は、文字列「\ 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(); 
    } 
} 
+0

問題は、シリアライズしても関係なく、\ bまたは\\ bはXMLに対して無効なとしてシリアル化しようとします。だから私はそれをCDATAする必要があります。正規表現 - '  [1-3] {1} #1〜3の値にする必要があります。 RegexString  \\ [1-3] \\ {1}  \\# \ be \\ a \\ value \\ of \\ 1 \\ 3 \/RegexString> ' –

+0

CDATAはXMLに0〜31文字を入れるのに役立ちません... –

+0

serialize関数で文字列xmlの下にあるハックの行。できます! \t \t \t xml = xml.Replace( ""、 "<![CDATA ["]; ' と' xml = xml.Replace( ""、 "]]>" ); 'どうしてこれを一般的に行うことができますか? –

関連する問題