2009-09-10 82 views

回答

3

你可以简单地将其设置为一个byte[]属性,它会Base64编码自动对其进行编码:

public class Test { 
    public byte[] MyProperty {get;set;} 

    public void SetMyProperty(string text) 
    { 
     MyProperty = System.Text.Encoding.Unicode.GetBytes(text); 
    } 
} 

Test test = new Test(); 
test. SetMyProperty("123456789123456789"); 

输出:

<MyProperty>MQAyADMANAA1ADYANwA4ADkAMQAyADMANAA1ADYANwA4ADkA</MyProperty> 

(尝试解码时here

不幸的是没有办法(我知道)使MyProperty私人,仍然被序列化在System.Xml.Serialization

2

您将字符串存储为Base64值,然后有一个属性在get子句中进行解码。

+1

+1,但我会做到这一点反过来(店平原,有编码/属性解码它只是序列化,前提是序列化不仅仅是访问字符串)。 – OregonGhost 2009-09-10 12:52:08

0

改变XmlSerializer类输出的唯一受支持的方式是,实现IXmlSerializable接口(不带有特殊隐藏属性等难看的黑客攻击)。

通过定义一个Base64String类来实现IXmlSerializable并只写出编码字符串,您可以节省自己不得不编写整个类的序列化代码。定义一个操作符,使其implicitly castable为一个字符串,它应该像一个普通的字符串一样工作。

4

Base64将二进制数据转换为字符串。如果你想base64对一个字符串中的数据进行编码,你需要首先将它编码为字节数组,例如,使用Encoding.UTF.GetBytes(myString)

这就提出了一个问题,为什么你首先要做这件事。如果你需要使用base 64,你确定你真的有文本数据开始?

+1

那么,默认情况下,将字符串字面值''''和'“\ 0”'往返于/从XML往返会很好。 – binki 2015-11-27 17:40:37

4

关注Jon Grant有用的建议我已经实现了封装所需Base64编码的Base64String类型。

public class Base64String: IXmlSerializable 
{ 
    private string value; 

    public Base64String() { } 

    public Base64String(string value) 
    { 
     this.value = value; 
    } 

    public string Value 
    { 
     get { return value; } 
     set { this.value = value; } 
    } 

    public static implicit operator string(Base64String x) 
    { 
     return x.ToString(); 
    } 

    public static implicit operator Base64String(string x) 
    { 
     return new Base64String(x); 
    } 

    public override string ToString() 
    { 
     return value; 
    } 

    #region IXmlSerializable Members 

    public System.Xml.Schema.XmlSchema GetSchema() 
    { 
     return null; 
    } 

    public void ReadXml(System.Xml.XmlReader reader) 
    { 
     MemoryStream ms = null; 
     byte[] buffer = new byte[256]; 
     int bytesRead; 

     while ((bytesRead = reader.ReadElementContentAsBase64(buffer, 0, buffer.Length)) > 0) 
     { 
      if (ms == null) 
       ms = new MemoryStream(bytesRead); 

      ms.Write(buffer, 0, bytesRead); 
     } 

     if (ms != null) 
      value = System.Text.UnicodeEncoding.Unicode.GetString(ms.ToArray()); 
    } 

    public void WriteXml(System.Xml.XmlWriter writer) 
    { 
     if (!string.IsNullOrEmpty(value)) 
     { 
      byte[] rawData = Encoding.Unicode.GetBytes(value); 
      writer.WriteBase64(rawData, 0, rawData.Length); 
     } 
    } 

    static public string EncodeTo64(string toEncode) 
    { 
     byte[] toEncodeAsBytes 
       = System.Text.UnicodeEncoding.Unicode.GetBytes(toEncode); 
     string returnValue 
       = System.Convert.ToBase64String(toEncodeAsBytes); 
     return returnValue; 
    } 

    static public string DecodeFrom64(string encodedData) 
    { 
     byte[] encodedDataAsBytes 
      = System.Convert.FromBase64String(encodedData); 
     string returnValue = 
      System.Text.UnicodeEncoding.Unicode.GetString(encodedDataAsBytes); 
     return returnValue; 
    } 

    #endregion 
} 

而且你可以使用这样的类型:

static void Main(string[] args) 
{ 
    Foo foo = new Foo(); 
    foo.Field1 = "Pluto"; 
    foo.Field2 = "Pippo"; 
    foo.Field3 = "Topolino"; 
    foo.Field4 = "Paperino"; 

    XmlSerializer ser = new XmlSerializer(typeof(Foo)); 
    ser.Serialize(Console.Out, foo); 
    Console.ReadLine(); 
} 

[XmlRoot("Sample")] 
public class Foo 
{ 
    public Foo() { } 

    [XmlElement("Alfa_64")] 
    public Base64String Field1; 

    [XmlElement("Beta")] 
    public string Field2; 

    [XmlElement("Gamma_64")] 
    public Base64String Field3; 

    [XmlElement("Delta_64")] 
    public Base64String Field4; 
}