は、単純なケースXmlSerializerを、base64でエンコード文字列のメンバー
public class Test {
public String myString;
}
がそれをシリアル化するとき、私はbase64でエンコードのmyStringへのXmlSerializerを伝えることができますどのような方法があります考えてみましょうか?
は、単純なケースXmlSerializerを、base64でエンコード文字列のメンバー
public class Test {
public String myString;
}
がそれをシリアル化するとき、私はbase64でエンコードのmyStringへのXmlSerializerを伝えることができますどのような方法があります考えてみましょうか?
あなたは、単にそれが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
にシリアライズする方法はありません。
文字列をBase64値として格納し、get節でその文字列をデコードするプロパティを持っています。
XmlSerializer
クラスからの出力を変更する唯一のサポートされている方法(特殊な隠しプロパティなどのような醜いハックなし)は、IXmlSerializable
インターフェイスを実装することです。
IXmlSerializable
を実装するBase64String
クラスを定義して、コード化された文字列を書き出すだけで、クラス全体のシリアル化コードを書く必要がなくなります。文字列をimplicitly castableにする演算子を定義すれば、通常の文字列のように動作するはずです。
Base64は、バイナリデータを文字列に変換します。文字列でデータをbase64でエンコードする場合は、まずバイト配列でエンコードする必要があります。 Encoding.UTF.GetBytes(myString)
を使用してください。
これは、なぜこれを最初に行うのがよいのかという疑問を提起します。ベース64を使用する必要がある場合は、実際にテキストデータを開始していることを確認してください。
まあ、文字列リテラル '' ''と '" \ 0 "'は、デフォルトでXMLとの往復を生き延びて生き生きとしています。 – binki
私は、必要な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;
}
+1、私はそれを他の方法でラウンド(店舗無地、/だけのシリアル化のためにそれをデコードエンコードする性質を持っているにしてくださいかかわらず、ただし、文字列へのアクセスよりもシリアライゼーションはあまり使用されません)。 – OregonGhost