2010-08-23 14 views
6

मैं इस उदाहरण के रूप में, एक सी # वर्ग कि BinaryFormatter द्वारा डिस्क पर धारावाहिक है:.NET में क्रमबद्ध एक वर्ग को दोबारा कैसे दोहराया जाए?

// Version 3.0 
[Serializable] 
public class Person 
{ 
    public string FullName; 

    [OptionalField(VersionAdded=2)] 
    public string NickName; 
    [OptionalField(VersionAdded=2)] 
    public DateTime BirthDate; 

    [OptionalField(VersionAdded=3)] 
    public int Weight; 
} 

बाद में, मैंने एक या निम्न
के अधिक से इस वर्ग के refactor करने के लिए चाहते हैं - इसका नाम बदलें
- अपने नाम स्थान
बदलें - जहाँ तक मेरा बता सकते हैं कि ठीक उसी नाम, नाम स्थान और विधानसभा नाम के साथ एक वर्ग उपलब्ध है, बाइनरी फ़ाइल केवल डी-श्रृंखलाबद्ध किया जा सकता है एक और विधानसभा

में ले जाएँ।

मैं इसके आसपास कैसे काम करूं?
क्या Version Tolerant Serialization तोड़ने के बिना डी-सीरियलाइजेशन को एक अलग वर्ग नाम, नामस्थान और असेंबली में मैप करना संभव है?

उत्तर

5

कुछ शोध के बाद मुझे एहसास हुआ कि बाइनरीफॉर्मेटर जो कुछ भी मैं ढूंढ रहा था उसका समर्थन करता है।

एक BinaryFormatter को

  1. एक प्रकार है कि मूल रूप से धारावाहिक करने के लिए डिज़ाइन नहीं किया गया था क्रमानुसार करने की क्षमता प्रदान करता है किराए की कोख उपयोग कर सकते हैं।
  2. किसी प्रकार के एक संस्करण को किसी अन्य प्रकार के दूसरे संस्करण में मैप करने का तरीका प्रदान करता है।

एक भी SerializationBinder का उपयोग करके बी (विभिन्न वर्ग के नाम, नाम स्थान और/या विधानसभा नाम) टाइप करने के लिए ग्रुप ए से अक्रमांकन मैप कर सकते हैं।

जहां तक ​​मैं कह सकता हूं, इससे धारावाहिक वर्गों को पुन: सक्रिय करना संभव हो जाता है और अकेले संस्करण द्वारा समर्थित नहीं होने वाले परिवर्तनों को तोड़ने के दौरान पिछड़ा संगतता बनाए रखना संभव हो जाता है।

संदर्भ: http://www.diranieh.com/NETSerialization/BinarySerialization.htm

संपादित करें: एक तरफ ध्यान दें पर, रिफैक्टरिंग क्षेत्र (नाम या प्रकार) अभी भी एक दर्द, के रूप में Renaming fields then deserializing in C# में चर्चा की है। मैं वर्तमान में भविष्य में इसे बेहतर तरीके से हल करने के लिए प्रोटोबफ-नेट में देख रहा हूं।

1

आप ISerializable इंटरफ़ेस को कार्यान्वित कर सकते हैं और GetObjectData को अपने स्वयं के deserialization प्रदान करने के लिए ओवरराइड कर सकते हैं। मैंने कोशिश नहीं की है, लेकिन आप अपनी पुरानी वस्तु को "मैन्युअल रूप से" deserialize करने में सक्षम होना चाहिए।

+0

तो क्या आपका मतलब है कि व्यक्ति को ISerializable और GetObjectData() लागू करना चाहिए? डी-सीरियलाइज़र कैसे पता चलेगा कि इस सटीक व्यक्ति वर्ग का उपयोग किया जाना चाहिए, जब इसका कोई अलग नाम, नामस्थान और/या असेंबली हो? क्या मैं किसी भी तरह से डी-सीरियलाइज़र को बता सकता हूं कि किस वर्ग का उपयोग करना है? – angularsen

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