2009-09-10 14 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 प्रयास करें) माइप्रोपर्टी निजी बनाने के लिए कोई रास्ता नहीं है (जिसे मैं जानता हूं) और अभी भी System.Xml.Serialization में क्रमबद्ध किया गया है।

2

आप स्ट्रिंग को बेस 64 मान के रूप में संग्रहीत करते हैं, और फिर एक ऐसी संपत्ति होती है जो इसे क्लॉज में डीकोड करता है।

+1

+1, हालांकि मैं इसे दूसरी तरह के दौर (दुकान सादा करना चाहते हैं, एक संपत्ति जो encodes/यह सिर्फ क्रमबद्धता के लिए डीकोड है , बशर्ते कि स्ट्रिंग तक पहुंचने से क्रमशः कम उपयोग किया जाए)। – OregonGhost

0

XmlSerializer कक्षा से आउटपुट को बदलने का एकमात्र समर्थित तरीका (विशेष छिपा गुण आदि जैसे बदसूरत हैक्स के बिना) IXmlSerializable इंटरफ़ेस को कार्यान्वित करना है।

आप Base64String कक्षा को परिभाषित करके पूरे वर्ग के लिए क्रमबद्धता कोड लिखने के लिए स्वयं को सहेज सकते हैं जो IXmlSerializable लागू करता है और केवल एन्कोडेड स्ट्रिंग लिखता है। एक ऑपरेटर को implicitly castable को स्ट्रिंग में बनाने के लिए परिभाषित करें और इसे सामान्य स्ट्रिंग की तरह काम करना चाहिए।

4

बेस 64 बाइनरी डेटा को एक स्ट्रिंग में परिवर्तित करता है। यदि आप स्ट्रिंग में डेटा को बेसोड एन्कोड करना चाहते हैं, तो आपको पहले इसे बाइट सरणी में एन्कोड करना होगा, उदा। Encoding.UTF.GetBytes(myString) का उपयोग कर।

इससे सवाल उठता है कि आप इसे पहले स्थान पर क्यों करना चाहते हैं। यदि आपको बेस 64 का उपयोग करने की आवश्यकता है, तो क्या आप वाकई से शुरू करने के लिए टेक्स्ट डेटा प्राप्त कर चुके हैं?

+1

ठीक है, तारों के अक्षर '' '' और '" \ 0 "होने पर डिफ़ॉल्ट रूप से एक्सएमएल से/राउंड ट्रिप में रहना अच्छा होगा। – binki

4

जॉन ग्रांट के बाद उपयोगी सुझाव मैंने बेस 64 स्ट्रिंग प्रकार को लागू किया है जो आवश्यक बेस 64 एन्कोडिंग को समाहित करता है।

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; 
} 
संबंधित मुद्दे