Changeset 10895


Ignore:
Timestamp:
05/27/14 10:13:24 (5 years ago)
Author:
epitzer
Message:

#2096 introduce base 64 sections to deal with special characters within CDATA

Location:
trunk/sources
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/sources/HeuristicLab.Persistence/3.3/Default/Xml/Primitive/String2XmlSerializer.cs

    r9456 r10895  
    2020#endregion
    2121
     22using System;
    2223using System.Text;
    2324using System.Text.RegularExpressions;
    2425using HeuristicLab.Persistence.Core;
    25 
    2626
    2727namespace HeuristicLab.Persistence.Default.Xml.Primitive {
     
    4242      sb.Append(s.Replace("]]>", "]]]]><![CDATA[>"));
    4343      sb.Append("]]>");
    44       return new XmlString(sb.ToString());
     44      s = special.Replace(sb.ToString(), m => ToBase64Tag(m.Value));
     45      return new XmlString(s);
    4546    }
    4647
    47     private static Regex re = new Regex(@"<!\[CDATA\[((?:[^]]|\](?!\]>))*)\]\]>", RegexOptions.Singleline);
     48    private static readonly Regex re = new Regex(@"<!\[CDATA\[((?:[^]]|\](?!\]>))*)\]\]>|<Base64>([^<]*)</Base64>", RegexOptions.Singleline);
     49    private static readonly Regex special = new Regex(@"[\x00-\x08\x0b\x0c\x0e-\x1f]+", RegexOptions.Singleline);
     50
     51    private static string ToBase64Tag(string s) {
     52      return new StringBuilder()
     53        .Append("]]><Base64>")
     54        .Append(Convert.ToBase64String(Encoding.ASCII.GetBytes(s)))
     55        .Append("</Base64><![CDATA[")
     56        .ToString();
     57    }
    4858
    4959    /// <summary>
     
    5565      StringBuilder sb = new StringBuilder();
    5666      foreach (Match m in re.Matches(x.Data)) {
    57         sb.Append(m.Groups[1]);
     67        if (m.Groups[1].Success)
     68          sb.Append(m.Groups[1].Value);
     69        else if (m.Groups[2].Success) {
     70          sb.Append(Encoding.ASCII.GetString(Convert.FromBase64String(m.Groups[2].Value)));
     71        }
    5872      }
    5973      string result = sb.ToString();
  • trunk/sources/HeuristicLab.Tests/HeuristicLab.Persistence-3.3/UseCases.cs

    r9778 r10895  
    14411441    }
    14421442
     1443    [TestMethod]
     1444    [TestCategory("Persistence")]
     1445    [TestProperty("Time", "short")]
     1446    public void TestSpecialCharacters() {
     1447      var s = "abc" + "\x15" + "def";
     1448      XmlGenerator.Serialize(s, tempFile);
     1449      var newS = XmlParser.Deserialize(tempFile);
     1450      Assert.AreEqual(s, newS);
     1451    }
     1452
     1453    [TestMethod]
     1454    [TestCategory("Persistence")]
     1455    [TestProperty("Time", "short")]
     1456    public void TestByteArray() {
     1457      var b = new byte[3];
     1458      b[0] = 0;
     1459      b[1] = 200;
     1460      b[2] = byte.MaxValue;
     1461      XmlGenerator.Serialize(b, tempFile);
     1462      var newB = (byte[]) XmlParser.Deserialize(tempFile);
     1463      CollectionAssert.AreEqual(b, newB);
     1464    }
     1465
     1466
    14431467    [ClassInitialize]
    14441468    public static void Initialize(TestContext testContext) {
Note: See TracChangeset for help on using the changeset viewer.