मुझे आपके डिज़ाइन को तोड़ने के बिना आप जो खोज रहे हैं उसे प्राप्त करने का एक साफ तरीका मिला।
इस विधि का उपयोग सुनिश्चित करेगा कि आपके निर्माता के नाम से जाना जाएगा और अपने केवल पढ़ने के लिए क्षेत्र ठीक से सेट।
आप क्या जरूरत है वास्तव में क्रमानुसार और एक डेटामॉडल वर्ग से [DataMember]
चिह्नित क्षेत्रों deserialize है।
यह किसी भी अनपेक्षित व्यवहार को यह जानने के लिए रोक देगा कि डेटाकंट्रैक्टसेरियलाइज़र deserializing जब कन्स्ट्रक्टर को कॉल नहीं करता है।
namespace MyApp.DataModel
{
//It is not mandatory to specify the DataContract since a default one will be
//provided on recent version of .Net, however it is a good practice to do so.
[DataContract(Name = "MyClassDataModel", Namespace = "MyApp.DataModel")]
public class MyClassDataModel
{
[DataMember]
public bool DataMemberExample{ get; set; }
}
}
deserializing और serializing के लिए अब आप इस वर्ग का उपयोग अपने मूल्यों को पकड़ने के लिए कर सकते हैं।
लोड होने पर आप एक नया डेटा मॉडल ऑब्जेक्ट बना सकते हैं और इसे अपनी कक्षा में पास कर सकते हैं जिसके लिए इसके कन्स्ट्रक्टर को कॉल करने की आवश्यकता है।
public MyObjectThatNeedToBeConstructed LoadData(){
// ...
// get your reader (Stream) from the file system or wherever it's located
var deserializer = new DataContractSerializer(typeof(MyClassDataModel));
var storedModel = (MyClassDataModel)deserializer.ReadObject(reader);
return new MyObjectThatNeedToBeConstructed(storedModel);
}
बचत आप अपने वर्ग से आवश्यक डेटा कि ReadOnly क्षेत्र शामिल निकाल सकते हैं पर।
public void SaveData(MyObjectThatNeedToBeConstructed myObject){
// ...
// get your writer (Stream) from memory or wherever it's located
var serializer = new DataContractSerializer(typeof(MyClassDataModel));
var dataModel = new MyClassDataModel{ DataMemberExample = myObject.DataMember};
serializer.WriteObject(writer, dataModel);
}
बेशक
, आप निर्माता के लिए एक अधिभार जोड़ना होगा और आप उदाहरण थोड़ा tweak करना पड़ सकता है, लेकिन मुझे लगता है कि आप चित्र मिल गया।
आप इसे क्यों नहीं देखते? – svick
@ एसविक: मैं इनटाइलाइजेशन करने के लिए किसी भी तंत्र के बारे में नहीं सोच सकता। DataContractSerializer एक खाली ऑब्जेक्ट को "निर्माण" करने के लिए 'FormatterServices.GetUninitializedObject' का उपयोग करता है और किसी कन्स्ट्रक्टर या रन फील्ड प्रारंभकर्ताओं को नहीं चलाता है। जहां तक मैं समझता हूं, एक 'पठनीय' फ़ील्ड केवल उन दो तरीकों में से एक में शुरू किया जा सकता है (लेकिन उम्मीद है कि एक और तरीका है जिसे मैं परिचित नहीं हूं)। –
ओह, मैंने सोचा था कि आप मैदान को deserialize करना चाहता था।क्या मैं आपको सही ढंग से समझता हूं कि उदाहरण के लिए आप फ़ील्ड को कुछ डिफ़ॉल्ट मान पर सेट करना चाहते हैं, जो धारावाहिक डेटा से नहीं आता है? – svick