2011-12-19 15 views
16

वहाँ विशेषताओं है कि अक्रमांकन दौरान xml फ़ाइल में नहीं हैं के मूलभूत मूल्यों का चयन करने के लिए एक रास्ता है?
mAge विशेषता xml फ़ाइल में मौजूद नहीं है, तो मैं 18 वर्ष की एक डिफ़ॉल्ट मान क्या यह संभव है का उपयोग करना चाहते हैं?DataContract, डिफ़ॉल्ट DataMember मूल्य

[DataContract] 
public class Person 
{ 
    public Person() 
    { 
    } 
    [DataMember(Name = "Name")] 
    public string mName { get; set; } 
    [DataMember(Name = "Age")] 
    public int mAge { get; set; } 
    [DataMember(Name = "Single")] 
    public bool mIsSingle { get; set; } 
}; 

उत्तर देने के लिए संपादित करें।

[DataContract] 
public class Person 
{ 
    public Person() 
    { 
    } 
    [DataMember(Name = "Name")] 
    public string mName { get; set; } 
    [DataMember(Name = "Age")] 
    public int? mAge { get; set; } 
    [DataMember(Name = "Single")] 
    public bool? mIsSingle { get; set; } 

    [System.Runtime.Serialization.OnDeserialized] 
    void OnDeserialized(System.Runtime.Serialization.StreamingContext c) 
    { 
     mAge = (mAge == null ? 18 : mAge); // 18 is the default value 
    } 
} 

उत्तर

21

आप का उपयोग [OnDeserialized]

OnDeserializedAttribute का उपयोग करें जब आप एक deserialized वस्तु पर मूल्यों को ठीक करने के बाद यह deserialized किया गया है और ग्राफ दिया जाता है से पहले की जरूरत है सकते हैं।

[DataContract] 
public class Person 
    { 
    public Person() 
    { 
    } 
    [DataMember(Name = "Name")] 
    public string mName { get; set; } 
    [DataMember(Name = "Age")] 
    public int mAge { get; set; } 
    [DataMember(Name = "Single")] 
    public bool mIsSingle { get; set; } 



    [System.Runtime.Serialization.OnDeserialized] 
    void OnDeserialized(System.Runtime.Serialization.StreamingContext c) 
    { 
     mAge = (mAge == 0) ?18:mAge; 
    } 
    } 
} 

संपादित करें: अपने टिप्पणियाँ

bool के लिए या से int आप उपयोग कर सकते nullable bool and nullable int इसलिए यदि इन उम्र और एकल विशेषताओं xml फ़ाइल में याद कर रहे हैं तो वे अशक्त रूप में अच्छी तरह हो जाएगा।

यहां त्वरित नमूना मैं

using System.Runtime.Serialization; 
using System.ServiceModel; 
using MySpace; 
using System.ServiceModel.Channels; 
using System; 
namespace MySpace 
{ 

[DataContract] 
public class Person 
    { 
    public Person() 
    { 
    } 
    [DataMember(Name = "Name")] 
    public string mName { get; set; } 
    [DataMember(Name = "Age")] 
    public int? mAge { get; set; } 
    [DataMember(Name = "Single")] 
    public bool? mIsSingle { get; set; } 



    [System.Runtime.Serialization.OnDeserialized] 
    void OnDeserialized(System.Runtime.Serialization.StreamingContext c) 
    { 
     mAge = (mAge == null ? 18 : mAge); 
    } 
    } 
} 
[ServiceContract] 
public interface IService 
{ 
    [OperationContract] 
    Person Method(Person dd); 
} 

public class Service : IService 
{ 
    public Person Method(Person dd) 
    { 
    return dd; 
    } 
} 

class Program 
{ 
    static void Main(string[] args) 
    { 
    string Url = "http://localhost:8000/"; 
    Binding binding = new BasicHttpBinding(); 
    ServiceHost host = new ServiceHost(typeof(Service)); 
    host.AddServiceEndpoint(typeof(IService), binding, Url); 
    host.Open(); 
    ChannelFactory<IService> fac = new ChannelFactory<IService>(binding); 
    fac.Open(); 
    IService proxy = fac.CreateChannel(new EndpointAddress(Url)); 
    Person d = new Person(); 
    d.mName = "BuzBuza"; 

    Console.WriteLine("Data before calling service " + (d.mAge == null ? " null " : d.mAge.Value.ToString())); 
    Console.WriteLine("Data before calling service " + (d.mIsSingle == null ? "null" : d.mIsSingle.Value.ToString())); 
    d = proxy.Method(d); 
    fac.Close(); 
    host.Close(); 
    Console.WriteLine("Data after calling service " + (d.mAge == null ? " null " : d.mAge.Value.ToString())); 
    Console.WriteLine("Data after calling service " + (d.mIsSingle == null ? "null" : d.mIsSingle.Value.ToString())); 

    Console.ReadLine(); 
    } 
} 
+0

यदि मैं किसी ऑब्जेक्ट के मान को ओवरराइड करना चाहता हूं, तो मैं आपके उत्तर का उपयोग कर सकता हूं, क्योंकि जब संदर्भ शून्य पर सेट होता है तो मुझे पता है कि विशेषता xml फ़ाइल में मौजूद नहीं है। लेकिन मुझे कैसे पता चलेगा कि xml फ़ाइल में कोई बूलियन या int विशेषता मौजूद है या नहीं? एक bolean के लिए मूल्य गलत पर सेट है या किसी पूर्णांक को 0 पर सेट है, तो मैं unseted attribut beetwen distingue नहीं कर सकते हैं और ग # डिफ़ॉल्ट मान पर seted attribut। – BuzBuza

+0

चूंकि deserilization किसी दिए गए ढांचे में अनुपलब्ध डेटा के लिए डिफ़ॉल्ट मान सेट करने का प्रयास करेगा, इसलिए आपका एकमात्र विकल्प मान्य मानों की जांच करना है जैसे कि मैंने अपना उत्तर अपडेट किया है और यह जांच रहा है कि उम्र mAge == 0 है तो अपना मान निर्धारित करें। –

+0

आप int और null पाने के लिए शून्य प्रकारों का उपयोग कर सकते हैं, कृपया मेरे अपडेट किए गए उत्तर –

2

यह काम करना चाहिए।

[DataContract] 
public class Person 
    { 
    public Person() 
    { 
    } 
    [DataMember(Name = "Name")] 
    public string mName { get; set; } 
    [DataMember(Name = "Age")] 
    public int mAge = 18; 
    [DataMember(Name = "Single")] 
    public bool mIsSingle { get; set; } 
    }; 

this पेज पर एक नजर डालें।

+0

नहीं, यह (बस इसे परीक्षण किया) काम नहीं करता। Deserializer आपके डिफ़ॉल्ट मान को ओवरराइड करता है, भले ही वह मान XML_ में मौजूद न हो। –

3

उपयोग [OnDeserializing()]

तैयार है और आप अक्रमांकन से पहले अपने मूल्यों को निर्धारित। तो कोई चेक जरूरी नहीं है, जो गलत हो सकता है - क्या होगा अगर एमएजी को 0 के रूप में क्रमबद्ध किया गया हो?

+0

जब आप सरल प्रकार (उदा। 'डबल') या structs deserialize यह जाने का सही तरीका है। अक्रमांकन इससे पहले कि आप कुछ ऐप्स-विशिष्ट डिफ़ॉल्ट (या अमान्य मान, जैसे 'double.NaN') है वैकल्पिक फ़ील्ड निर्धारित किया है। Deserialization एक्सएमएल फ़ाइल में दिए गए सभी मूल्यों को ओवरराइट करेगा और दूसरों को छूटेगा। Deserialization के बाद आप शून्य मान "एक्सएमएल से सेट" और एक शून्य मान "सेट नहीं किया जा रहा" अंतर नहीं कर सकते हैं। –

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