2009-09-10 28 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

0

XmlSerializerクラスからの出力を変更する唯一のサポートされている方法(特殊な隠しプロパティなどのような醜いハックなし)は、IXmlSerializableインターフェイスを実装することです。

IXmlSerializableを実装するBase64Stringクラスを定義して、コード化された文字列を書き出すだけで、クラス全体のシリアル化コードを書く必要がなくなります。文字列をimplicitly castableにする演算子を定義すれば、通常の文字列のように動作するはずです。

4

Base64は、バイナリデータを文字列に変換します。文字列でデータをbase64でエンコードする場合は、まずバイト配列でエンコードする必要があります。 Encoding.UTF.GetBytes(myString)を使用してください。

これは、なぜこれを最初に行うのがよいのかという疑問を提起します。ベース64を使用する必要がある場合は、実際にテキストデータを開始していることを確認してください。

+1

まあ、文字列リテラル '' ''と '" \ 0 "'は、デフォルトでXMLとの往復を生き延びて生き生きとしています。 – binki

4

私は、必要な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; 
} 
関連する問題