2015-06-25 9 views
7
का उपयोग कर

मैंकैसे सी # में अक्रमांकन दौरान कस्टम वस्तु के लिए एक्सएमएल गुण परिवर्तित करने के लिए XmlSerializer

InvalidCastException: IdTag

को System.String जबकि प्रयास कर: मूल्य एक परिवर्तनीय वस्तु नहीं है एक्सएमएल विशेषता deserialize करने के लिए।

<?xml version="1.0" encoding="windows-1250"?> 
<ArrayOfItem xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 
    <Item Name="Item Name" ParentId="SampleId" /> 
</ArrayOfItem> 

नमूना कक्षाएं:

public class Item 
{ 
    [XmlAttribute] 
    public string Name { get; set; } 

    [XmlAttribute] 
    public IdTag ParentId { get; set; } 
} 

[Serializable] 
public class IdTag 
{ 
    public string id; 
} 

अपवाद Convert.ToType() विधि (जो XmlSerializer से कहा जाता है) से फेंक दिया जाता है

यहाँ नमूना एक्सएमएल है। AFAIK IdTag में कनवर्ट करने के लिए System.String के लिए IConvertible इंटरफ़ेस को "कार्यान्वित" करने का कोई तरीका नहीं है। मुझे पता है कि मैं प्रॉक्सी प्रॉपर्टी को कार्यान्वित कर सकता हूं i.e:

public class Item 
{ 
    [XmlAttribute] 
    public string Name {get; set;} 

    [XmlAttribute("ParentId")] 
    public string _ParentId { get; set; } 

    [XmlIgnore] 
    public IdTag ParentId 
    { 
     get { return new IdTag(_ParentId); } 
     set { _ParentId = value.id; } 
    } 
} 

क्या कोई अन्य तरीका है?

उत्तर

2

आपको XmlSerializer को अपने IdTag ऑब्जेक्ट में देखने की आवश्यकता है। संभवतः, उस वस्तु की एक संपत्ति है जिसे आप क्रमबद्ध करना चाहते हैं (पूरी वस्तु नहीं)। - जब आप इस deserialize, अपने ParentIdTag प्रॉक्सी वस्तु ठीक से होना चाहिए

[XmlIgnore] 
public IdTag ParentIdTag { get; set; } 

[XmlAttribute] 
public string ParentId 
{ 
    get { return ParentIdTag.id; } 
    set { ParentIdTag.id = value; } 
} 

नोट इस और आप क्या पोस्ट के बीच का अंतर:

[XmlAttribute] 
public IdTag ParentId { get; set; } 
इस के लिए

:

तो आप इस बदल सकता है प्रारंभ।

+0

निश्चित रूप से एक सुधार - गेटटर से क्लास कन्स्ट्रक्टर के मालिक होने के लिए 'नया आईडीटाग (..) 'स्थानांतरित करता है। धन्यवाद। –

संबंधित मुद्दे