2009-06-24 12 views
16

क्रमबद्ध करें मेरे पास एक कक्षा है जिसे मैंने यूरियल संपत्ति के साथ Serializable के रूप में चिह्नित किया है। मैं यूरी को प्रकार स्ट्रिंग की संपत्ति के बिना धारावाहिक/deserialize करने के लिए कैसे प्राप्त कर सकते हैं?कैसे करें (xml) एक यूरी

+1

सुझाव है XmlSerializer; असल में, आपको इसके लिए [Serializable] की आवश्यकता नहीं है - इस प्रकार को सिर्फ सार्वजनिक होना चाहिए। –

उत्तर

12

how to serialize TimeSpan के लिए उत्तर मैं इस जो मेरे लिए काफी अच्छी तरह से काम करता है और अतिरिक्त संपत्ति की आवश्यकता नहीं है के साथ समाप्त हो गया में से एक के आधार पर :

public class XmlUri : IXmlSerializable 
{ 
    private Uri _Value; 

    public XmlUri() { } 
    public XmlUri(Uri source) { _Value = source; } 

    public static implicit operator Uri(XmlUri o) 
    { 
     return o == null ? null : o._Value; 
    } 

    public static implicit operator XmlUri(Uri o) 
    { 
     return o == null ? null : new XmlUri(o); 
    } 

    public XmlSchema GetSchema() 
    { 
     return null; 
    } 

    public void ReadXml(XmlReader reader) 
    { 
     _Value = new Uri(reader.ReadElementContentAsString()); 
    } 

    public void WriteXml(XmlWriter writer) 
    { 
     writer.WriteValue(_Value.ToString()); 
    } 
} 

तो आप इसे इस

public class Settings 
{ 
    public XmlUri Uri { get; set; } 
} 

... 
var s = new Settings { Uri = new Uri("http://www.example.com") }; 

की तरह उपयोग कर सकते हैं और यह अच्छी तरह से क्रमानुसार और deserialize होगा।

नोट: उपरोक्त लिंक किए गए प्रश्न में XmlSerializer रिक्त डिफ़ॉल्ट कन्स्ट्रक्टर के लिए चेक के रूप में XmlElement(Type = typeof(...)) विशेषता के साथ चाल का उपयोग नहीं कर सकता है।

0

Uri कक्षा ISerializable इंटरफ़ेस लागू करता है ताकि यह धारावाहिक/deserialization का ख्याल रखने में सक्षम होना चाहिए।

+0

हम्म, शायद 3.5 चीज? मुझे अपवाद मिलता है कि जब मैं 2 में क्रमबद्ध करता हूं तो कोई डिफ़ॉल्ट कन्स्ट्रक्टर नहीं होता है।0 – Jeremy

+4

यह * बाइनरी * क्रमबद्धता के लिए है; प्रश्न (टैग देखें) लगभग * xml * serialization –

-1

उरी पहले से ही क्रमबद्ध है, इसलिए मुझे विश्वास नहीं है कि आपको कुछ भी करना है।

http://msdn.microsoft.com/en-us/library/system.uri(VS.80).aspx

+3

टैग्स xmlserializer का सुझाव देते हैं, ताकि (अकेला) अधिक नहीं करता –

32

एक्सएमएल serializer के साथ, आप सीमित हैं - यह के रूप में (जैसे) BinaryFormatter/ISerializable विकल्पों में से कुछ के रूप में बहुमुखी नहीं है। एक लगातार चाल क्रमबद्धता के लिए एक दूसरे की संपत्ति है:

[XmlIgnore] 
public Uri Uri {get;set;} 

[XmlAttribute("uri")] 
[Browsable(false), EditorBrowsable(EditorBrowsableState.Never)] 
public string UriString { 
    get {return Uri == null ? null : Uri.ToString();} 
    set {Uri = value == null ? null : new Uri(value);} 
} 

दो ब्राउज़ करने योग्य गुण दिखने से छुपाने (लेकिन यह इसका इस्तेमाल करने के लिए XmlSerializer सार्वजनिक एपीआई पर होने की जरूरत है)। XmlIgnore यह बताता है कि Uri का प्रयास न करें; और [XmlAttribute(...)] (या [XmlElement(...)]) इसे UriString का नाम बदलने के लिए कहता है जब (डी) इसे क्रमबद्ध करता है।

(ध्यान दें कि EditorBrowsable केवल विधानसभा प्रकार की घोषणा के बाहर कोड पर लागू होता है)

+0

का समर्थन नहीं करता है नोट: यहां एक छोटा सा झटका है। क्रमबद्धता काम करेगी, लेकिन डी-क्रमबद्धता विफल हो जाएगी। –

+0

@ श्रीवांत अट्टानायक मुझे लगता है कि उरी पर निर्भर करता है। – Aelphaeis

1

उन लोगों के लिए जिन्होंने इस प्रश्न को पाया और जिन्हें समाधान पसंद नहीं आया, वहां एक और अधिक लचीला और शक्तिशाली समाधान है। यह कार्यान्वयन IXmlSerializable इंटरफ़ेस है। यह और अधिक कठिन है, लेकिन यह इसके लायक है। आप जो भी एक्सएमएल चाहते हैं उसे बना सकते हैं। सबसे सरल उदाहरण है:

public class Product : IXmlSerializable 
{ 
    public string Code { get; set; } 

    public string Model { get; set; } 

    public string Name { get; set; } 

    public Uri ImageUri { get; set; } 

    public virtual System.Xml.Schema.XmlSchema GetSchema() 
    { 
     throw new NotImplementedException(); 
    } 

    public virtual void ReadXml(XmlReader reader) 
    { 
     reader.MoveToContent(); 
     Code = reader.GetAttribute("Code"); 
     Model = reader.GetAttribute("Model"); 
     Name = reader.GetAttribute("Name"); 
     if (reader.ReadToDescendant("Image") && reader.HasAttributes) 
      ImageUri = new Uri(reader.GetAttribute("Src")); 
    } 

    public virtual void WriteXml(XmlWriter writer) 
    { 
     writer.WriteAttributeString("Code", Code); 
     writer.WriteAttributeString("Model", Model); 
     writer.WriteAttributeString("Name", Name); 
     if (ImageUri != null) 
     { 
      writer.WriteStartElement("Image"); 
      writer.WriteAttributeString("Src", ImageUri.AbsoluteUri); 
      writer.WriteEndElement(); 
     } 
    } 
} 

और आप XML में कुछ इस तरह मिलती है:

<PriceContainer Code="314" Model="PP500" Name="NuTone PurePower PP500 Power Unit"> 
    <Image Src="http://www.thinkvacuums.com/images/nutone-pp500-activac.jpg" /> 
</PriceContainer> 
टैग
संबंधित मुद्दे