2013-02-21 70 views
5

में वैल्यू प्रॉपर्टी का उपयोग करके एक्सएमएल से डीमेर से डीरियललाइज एनम, मैं सी # में पुस्तक आयात उपकरण के लिए एक ONIX लिखने की कोशिश कर रहा हूं। मैंने Xsd2Code का उपयोग करके कक्षाएं बनाकर शुरू किया और सभी गुणों के साथ एक विशाल फ़ाइल प्राप्त की जो कुछ tweaks deserializing पर कोई त्रुटि उत्पन्न नहीं करता है।सी #

मैं एक पूरे तत्व को स्मृति में एक बड़ी वस्तु में deserialize करने की कोशिश कर रहा हूँ और फिर इसके साथ सामान (जैसे इसे डेटाबेस में सहेजें)।

Xsd2Code वर्गों को उत्पन्न करने के तरीके के अलावा, इस तथ्य के अलावा कि बहुत सारे गुण हैं, कम से कम मेरे लिए थोड़ा अजीब हैं।

यहाँ वर्ग है जो उत्पाद वस्तु की संपत्ति होना चाहिए में से एक है:

public partial class NotificationType 
{ 
    public NotificationTypeRefname refname { get; set; } 
    public NotificationTypeShortname shortname { get; set; } 

    public SourceTypeCode sourcetype { get; set; } 

    public List1 Value { get; set; } 
} 

मैं इस लाइन पर अपना ध्यान केंद्रित करना चाहते हैं:

public List1 Value { get; set; } 

"List1" एक enum है , इस प्रकार परिभाषित किया गया:

public enum List1 
{ 
    [System.Xml.Serialization.XmlEnum("01")] 
    Item01, 

    [System.Xml.Serialization.XmlEnum("02")] 
    Item02, etc... 

मेरी समस्या यह है कि deserialization के दौरान, सभी क्षेत्रों को सही करने के लिए deserialize वाई Enums से बाहर।

मैंने XmlEnum ("अधिसूचना टाइप") आदि के साथ गुणों को सजाने की कोशिश की ... कुछ भी नहीं!

यह मेरा अक्रमांकन कोड है:

var p = new Product(); 
XmlSerializer pserializer = new XmlSerializer(p.GetType()); 
object pDeserialized = pserializer.Deserialize(reader); 
p = (Product) pDeserialized; 

इस तरह इस तत्व एक्सएमएल में दिखाई देता है:

<NotificationType>03</NotificationType> 

संपत्ति उत्पाद वस्तु के लिए सी # में है:

public NotificationType NotificationType { get; set; } 

यदि मैं इसे बदलता हूं:

public List1 NotificationType { get; set; } 

deserialization सही ढंग से 'Item03' दिखाता है, जिसका अर्थ यह है कि यह XML में जो भी है उसे पढ़ता है। अगर मैं इसे ऊपर की तरह छोड़ देता हूं, अधिसूचना प्रकार की 'मूल्य' संपत्ति कभी भर नहीं जाती है, और हमेशा आइटम 01 (एनम का डिफ़ॉल्ट) दिखाती है।

मैंने एसओ और वेब खोजों पर सभी संभावित प्रश्नों को समाप्त कर दिया है, क्योंकि यह वैल्यू प्रॉपर्टी कुछ प्रकार (स्ट्रिंग्स) के साथ काम करती है लेकिन एनम्स नहीं। क्या मैं कुछ भूल रहा हूँ?

लंबे प्रश्न और कोड के लिए खेद है। इस मुद्दे पर किसी भी प्रकाश को छोड़कर किसी भी प्रकाश की सराहना करें। पूरे दिन के लिए इसके साथ अटक गया।

उत्तर

1

public List1 Value { get; set; } संपत्ति को [System.Xml.Serialization.XmlTextAttribute()] जोड़ने का प्रयास करें।

+0

यह काम करता है! मैं कसम खाता हूँ कि मैंने पहले कोशिश की है। मुझे लगता है कि यह वह विशेषता है जो deserialization लाइब्रेरी को पता है कि XML तत्व के मान के रूप में कौन सी संपत्ति भरनी है। –

+0

मेरे लिए काम नहीं करता है। –

+0

पागल, मैं भी ONIX पर काम कर रहा हूँ! एक ही चीज एक सिंगल एनम वैल्यू के लिए भी मेरे लिए बहुत अच्छा काम करती है। Enums की एक सरणी desessizing के साथ कोई भाग्य? जैसे सूची 9 1 []? –

2

इस प्रयास करें:

public partial class NotificationType 
{ 
    public NotificationTypeRefname refname { get; set; } 
    public NotificationTypeShortname shortname { get; set; } 
    public SourceTypeCode sourcetype { get; set; } 

    public List1 Value { get { 
     return (List1)Enum.Parse(typeof(List1), 
      Enum.GetName(typeof(List1), int.Parse(List1Value) - 1)); 
    }} 

    [XmlText] 
    public string List1Value { get; set; } 
} 

[अद्यतन]

के बाद से:

  1. मैं भी पर की कोशिश की पहले XmlText विशेषता के साथ सदस्य सजाने, लेकिन निम्न अपवाद था घटित:

    'कंसोल अनुप्रयोग 1.NotificationType' प्रकार की ऑब्जेक्ट को क्रमबद्ध नहीं कर सकता। XmlText सदस्य 'ConsoleApplication1.NotificationType.Value' कंसोल अनुप्रयोग 1। स्ट्रिंग या स्ट्रिंग सरणी के लिए बदलें प्रकार पर विचार करें।

  2. और आप जवाब में मेरी प्रारंभिक दृष्टिकोण से बचने के लिए चाहते हैं,

वास्तविक समाधान है कि, Value को XmlText विशेषता को लागू करने के अलावा, अन्य सभी सदस्यों के साथ सजाया जाना चाहिए है । मेरा मानना ​​है कि XmlText अकेले गारंटीकृत समाधान नहीं है, क्योंकि परिणाम अन्य सदस्यों के अस्तित्व पर निर्भर करते हैं।

public class NotificationType 
{ 
    [XmlIgnore] // required 
    public NotificationTypeRefname refname { get; set; } 
    [XmlIgnore] // required 
    public NotificationTypeShortname shortname { get; set; } 
    [XmlIgnore] // required 
    public SourceTypeCode sourcetype { get; set; } 

    [XmlText] // required 
    public List1 Value { get; set; } 
} 
+0

वोट दिया गया, यह भी काम करता है लेकिन कम प्रत्यक्ष तरीके से। मैं वास्तव में प्रत्येक मामले के लिए एक अतिरिक्त संपत्ति पेश नहीं करना चाहता क्योंकि ONIX विनिर्देश में इनमें से 200 हैं। –

+0

@ क्रिस्टीकोटोवैन, जब भी मैं पीबीजे के उत्तर का प्रयास करता हूं तो मेरे पास 'अवैधऑपरेशन अपवाद' भी होता है। उसका जवाब मेरी पहली कोशिश थी, लेकिन यह असफल रहा (और यह अभी भी विफल रहता है), इसलिए मैंने एक कामकाज की तलाश की। –

+0

यह यहां काम करता है, मुझे नहीं पता कि यह आपके लिए क्यों विफल रहा। मैं इसे इस तरह से पसंद करता हूं क्योंकि यह क्लीनर है और मैं शीर्ष पर अन्य चीजें जोड़ रहा हूं (जैसे प्रत्येक एनम संस्करण को वर्णित करना और प्रत्येक एनम मूल्य के लिए उपयोगकर्ता के अनुकूल अर्थ को प्रदर्शित करने के लिए प्रतिबिंब का उपयोग करके निकालना)। –