2012-01-23 24 views
11

XmlSerialize मैं इस:एक Enum करें क्षेत्र

[Flags] 
    public enum InfoAbonne{civilite,name,firstname,email,adress,country } 

    public class Formulaire 
    { 
     private InfoAbonne _infoAbonne{ get; set;} 
     public Formulaire() 
     {} 
    } 

मैं क्रमानुसार Formulaire

एक्सएमएल चाहते हैं मैं init:
_infoAbonne = InfoAbonne.name | InfoAbonne.email;

मेरी xml परिणाम में मैं केवल मिलती है:

<InfoAbonne>email</InfoAbonne> 

उत्तर

14

भले ही आप अपने enum करने के लिए Flags विशेषता को जोड़, आप अब भी लगता है कि मानों दो की शक्तियों रहे हैं बनाने की जरूरत है:

[Flags] 
public enum InfoAbonne 
{ 
    civilite = 1, 
    name = 2, 
    firstname = 4, 
    email = 8, 
    adress = 16, 
    country = 32 
} 

दिशा निर्देशों टिप्पणी में बाहर रखी देखें वीं की अनुभाग ई documentation

+1

ठीक जटिल कामों से पहले मेरी मदद मिली है, ठीक है, लेकिन यह सामान्य है, लेकिन क्या यह सामान्य है कि मुझे सभ्य ईमेल मेरे दो मूल्यों के बीच एक स्थान के साथ मिलता है? सादगी और एमएसडीएन संदर्भ के लिए –

+0

+1। हालांकि आपके उत्तर से 11: 1 अपवॉट अनुपात थोड़ा सा है! कभी नहीं;) –

+0

@ डॉ एंड्रयूबर्नेट-थॉम्पसन: सहमत। इसका कारण यह हो सकता है कि आपने अपना ध्यान धारावाहिक भाग पर रखा है और बाद में केवल उस हिस्से को जोड़ा जो अंतर्निहित समस्या को हल करता है। –

7

इन प्रकार ओ के साथ मूल विचार एफ समस्याएं एक बैकिंग फ़ील्ड को क्रमबद्ध करना है जो उस क्षेत्र की नकल करता है जिसे आप क्रमबद्ध करना चाहते हैं। इसी सिद्धांत के बजाय Enum क्षेत्र सीधे serializing की, इस तरह के बिटमैप आदि के रूप में जटिल प्रकार के लिए लागू किया जा सकता है ... उदाहरण के लिए, आप प्रकार int के समर्थन क्षेत्र को क्रमानुसार सकता है:

// Disclaimer: Untested code, both in execution and compilation 
[Flags]  
public enum InfoAbonne 
{ 
    civilite = 0x1, // Increment each flag value by *2 so they dont conflict 
    Name=0x2, 
    firstname=0x4, 
    email=0x8, 
    adress=0x10, 
    country=0x20 
} 

// Don't serialize this field 
[XmlIgnore] 
private InfoAbonne _infoAbonne { get; set;} 

// Instead serialize this field as integer 
// e.g. name | email will equal 0xA in hex, or 10 in dec 
[XmlElement("InfoAbonne")] 
private InfoAbonneSerializer 
{ 
    get { return (int)_infoAbonne; } 
    set { _infoAbonne= (InfoAbonne) value; } 
} 

सादर,

+0

मुझे समझ में नहीं आता कि आप एक InfoAbonneSerializer का उपयोग क्यों कर रहे हैं। मैं int मूल्य नहीं चाहता। –

+0

@ क्रिस्टोफडेबोव हाय वहाँ। सीरिएलाइज़र फ़ील्ड उस वास्तविक क्षेत्र को लपेटता है जिसे आप अपने डोमेन ऑब्जेक्ट में एक्सपोज़ करना चाहते हैं, जिससे इसे सही ढंग से क्रमबद्ध किया जा सके। यह वास्तव में कोई फर्क नहीं पड़ता कि एक्सएमएल फ़ाइल में मूल्य क्या है, जब तक यह जारी रहता है और पुनः लोड किया जा सकता है। –

+0

एंड्रयू बर्नेट-थॉम्पसन ठीक है, लेकिन मुझे deserialize की जरूरत नहीं है, लेकिन मैं इसे xslt परिवर्तन के लिए उपयोग करता हूं, इसलिए enum "text" मान मेरे लिए अधिक interresting है। लेकिन धन्यवाद –

0

डॉ ABT के जवाब चयनित जवाब से बेहतर है। हां, 2 की शक्तियों में मूल्य होने के लिए आवश्यक है, लेकिन यह एक्सएमएल सीरियलाइजेशन मुद्दों के लिए विशिष्ट नहीं है।

Enums सबसे वस्तुओं की तुलना बहुत अलग ढंग क्रमानुसार लगे हुए हैं। नामों के मूल्य (ser(MyEnumProperty.[Name]) = 8) का उपयोग करने के बजाय एनम्स एक्सएमएल उनके नाम (ser(MyEnumProperty.[Name]) = "[Name]") द्वारा क्रमबद्ध किया जाएगा।

// Version 1.0 
[Flags]  
public enum MyEnum 
{ 
    None = 0, 
    First = 1, 
    Second = 2, 
    All = First | Second 
} 

public MyEnum MyEnumProperty = MyEnum.All; 

आप MyEnumProperty क्रमानुसार करने थे, तो आप <MyEnum>All</MyEnum> मिलेगा। हालांकि, अगर आप (int)MyEnumProperty धारावाहिक, आप <int>3</int> मिलेगा। मैं उल्लेख करना चाहते हैं यही कारण है कि इस अविश्वसनीय रूप से पता करने के लिए आवश्यक है ...

// Version 2.0 
[Flags]  
public enum MyEnum 
{ 
    None = 0, 
    First = 1, 
    Second = 2, 
    Third = 4, // <--- 
    All = First | Second | Third 
} 

मैं नए Enum मूल्यों, (एक DLL के रूप में) अन्य परियोजनाओं में इस्तेमाल किया गया है हो सकता है जोड़ दिया है। ओह वाह ... ये त्रुटियां क्या हैं?

अब आप एक्सएमएल सीरियलाइजेशन (Binary Serialization के साथ पुराने संस्करण में एनम के अपने नवीनतम संस्करण को विलुप्त नहीं कर सकते हैं)!

माइक्रोसॉफ्ट द्वारा ToEnum विधि पर एक नजर डालें। यह एक आईडी (कहते हैं, अद्यतन एनम में "तीसरा") को देखने से रोकता है क्योंकि यह मूल enum में मौजूद नहीं है। यह भी ध्यान रखें कि एक त्रुटि फेंक दी जाएगी जो आपके प्रोजेक्ट को तोड़ सकती है अगर इसे संभाला नहीं जाता है।

सुरक्षित रहें, हमेशा क्रमानुसार और जब मौका दिया मूल्य से deserialize। यही कारण है कि हम शुरू करने के लिए ध्वजांकित enums जैसे वस्तुओं का उपयोग करें। ध्वजांकित enums जैसे ऑब्जेक्ट्स पीछे की संगतता और निर्भरता मुद्दों को कम करता है।

0
[Flags] 
public enum InfoAbonne 
{ 
    civilite = (1 << 0), 
    name = (1 << 1), 
    firstname = (1 << 2), 
    email = (1 << 3), 
    adress = (1 << 4), 
    country = (1 << 5) 
} 
+2

स्टैक ओवरफ़्लो में आपका स्वागत है। ओपी के प्रश्न को हल करने के तरीके के बारे में थोड़ा सा स्पष्टीकरण जोड़ने पर विचार करें। –

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