7

मैं एक कस्टम वर्ग MyClass लिखा गया है और यह <Serializable()> विशेषता के साथ चिह्नित है। मेरे हार्ड ड्राइव पर बाइनरी फाइलों का एक सेट है जिसे मैंने BinaryFormatter का उपयोग करके क्रमबद्ध किया है जो MyClass के उदाहरणों से आया है।क्या अंतर्निहित वर्ग थोड़ा बदल दिया गया है जब मैं किसी ऑब्जेक्ट को deserialize कर सकते हैं?

मैं हाल ही में (,, कुछ गुण जोड़ा कुछ गुण नष्ट कर दिया कुछ तरीकों, आदि परिवर्तित) थोड़ा MyClass की संरचना बदल दिया है।

जब मैं इस बदली हुई वर्ग नीचे कोड का उपयोग करने के मौजूदा वस्तुओं deserialize करने की कोशिश क्या होता है? मैंने कोशिश की है और कोई फेंक दिया गया या कुछ भी नहीं था - लेकिन निश्चित रूप से यह वर्ग बदलने पर ठीक से deserialize नहीं कर सकता है? क्या कोई तरीका है कि मैं धारावाहिक फ़ाइलों से कुछ उपयोगी जानकारी प्राप्त कर सकता हूं भले ही मैंने कक्षा को अद्यतन किया हो?

धन्यवाद।

Public Sub serializeObject(ByVal obj As Object, ByVal outFilename As String) 
    Dim fStream As FileStream 
    Try 
     fStream = New FileStream(outFilename, FileMode.Create) 
     Dim bfmtr As New BinaryFormatter 
     bfmtr.Serialize(fStream, obj) 
     fStream.Close() 
    Catch ex As Exception 
     MsgBox("Failed to serialize: " & ex.Message) 
     Throw 
    End Try 
End Sub 

और अक्रमांकन मैं उपयोग कर रहा हूँ करने के लिए:

myObj = CType(deserializeObject("C:\myobject.bin"), MyClass)) 

कहाँ deserializeObject है:


यहाँ कोड मैं क्रमबद्धता करने के लिए उपयोग कर रहा हूँ है

Public Function deserializeObject(ByVal srcFilename As String) As Object 
    If File.Exists(srcFilename) Then 
     Dim fStream As Stream = File.OpenRead(srcFilename) 
     Dim deserializer As New BinaryFormatter 
     Dim returnObject As Object = deserializer.Deserialize(fStream) 
     fStream.Close() 
     Return returnObject 
    Else 
     Throw New ApplicationException("File not found: " & srcFilename) 
    End If 
End Function 

उत्तर

0

जोड़ना और हटाना खेतों में कोई समस्या नहीं होनी चाहिए - मेरे पास अनुभवजन्य सबूत है, न कि मुझे पता है कि क्रमबद्धता विस्तार से कैसे काम करती है।

आप समस्याओं हो सकता था जब निजी संपत्तियों का नाम बदलने। अन्य सभी चीजें, यहां तक ​​कि खेतों की पुनरावृत्ति करते हुए, आप शांत हैं।

+0

यदि आप फ़ील्ड्स को हटाते हैं, तो यदि सीरियलाइज्ड डेटा में संपत्ति मौजूद है तो आपको एक त्रुटि मिलेगी। खेतों को जोड़ना ठीक होना चाहिए। आप असेंबली वर्जन # या मजबूत नामकरण कुंजी भी नहीं बदल सकते क्योंकि इससे विलुप्त होने में असफलता भी हो जाएगी। –

+0

@Robert। आप इसके बारे में पूरी तरह से गलत हैं। यदि प्रत्येक संपत्ति को धारावाहिक प्रारूप में मौजूद होना आवश्यक था तो हमारे पास डेटा अनुबंध गुण नहीं होंगे जैसे [IgnoreDataMember]। – BentOnCoding

+2

यह बाइनरी क्रमबद्धता है। जब आप एक्सएमएल सीरियलाइजेशन का जिक्र कर रहे हों तो आप सही हैं, लेकिन बाइनरी सीरियलाइजेशन deserialization पर असफल हो जाएगा यदि आप serialization के बाद किसी ऑब्जेक्ट से कोई संपत्ति हटाते हैं। –

1

अतीत मैं धारावाहिक वस्तुओं में मामूली परिवर्तन के बीच संगतता मुद्दों BinaryFormatter का उपयोग कर पड़ा है, और मैं भी पूरी तरह से क्यों समझ में नहीं आता। एक "असुरक्षित" विधि है जो कि एक प्रकार का संगत "deserialize" का तात्पर्य है।

"क्या होता है" है यह एक अनुकूलता को तोड़ने के परिवर्तन है जब, आप बस वस्तु को पुन: नहीं कर सकते। मुझे नहीं पता कि पुरानी कोड संरचना का उपयोग करने से इसे फिर से बनाने के लिए कोई तरीका है या नहीं।

मैं (ताकि आप संभवतः आप बाद में किसी भी समस्या को ठीक कर सकता है और पठनीय है) इन मामलों जो ज्यादा सुरक्षित हो रहा है में XML क्रमांकन का इस्तेमाल किया है

लागत है एक्सएमएल धारावाहिक वस्तुओं के आकार में काफी है कि ज्यादातर मामलों में बड़ा है। संपीड़न/डिकंप्रेसिंग उसकी मदद कर सकती है।

यहाँ मेरी एक्सएमएल दिनचर्या मैं इस के लिए उपयोग कर रहे हैं।

''' <summary> 
''' Serializes as object into XML format 
''' This IS different then SOAP Serialization. 
''' </summary> 
''' <typeparam name="ObjectType">The type of the object being serialized</typeparam> 
''' <param name="oObj">The object to serialize</param> 
''' <returns>The XML Document (string) that is the serialized object in text form</returns> 
Public Shared Function XmlSerialize(Of ObjectType)(ByVal oObj As Object) As String 
    Dim sb As New System.Text.StringBuilder 
    Dim sw As New IO.StringWriter(sb) 
    Dim x As New System.Xml.Serialization.XmlSerializer(GetType(ObjectType)) 
    x.Serialize(sw, oObj) 
    Return sb.ToString 
End Function 
''' <summary> 
''' DeSerializes and object from an XML Document 
''' This IS different then SOAP Serialization. 
''' </summary> 
''' <typeparam name="ObjectType">The Object type that will be returned (That the XML Data is derived from)</typeparam> 
''' <param name="oObj">The Object (in it's XML Document serialized format)</param> 
''' <returns>The new object</returns> 
Public Shared Function XmlDeSerialize(Of ObjectType)(ByVal oObj As String) As ObjectType 
    Dim sr As New IO.StringReader(oObj) 
    Dim x As New System.Xml.Serialization.XmlSerializer(GetType(ObjectType)) 
    Dim out As ObjectType = CType(x.Deserialize(sr), ObjectType) 
    Return out 
End Function 
+0

उल्लेख करने के लिए कुछ और। एक्सएमएल आपके उद्देश्य के लिए उपयुक्त नहीं हो सकता है क्योंकि मुझे नहीं पता कि यह serailization में "निजी" डेटा से कैसे निपटता है। कहने की जरूरत नहीं है कि बाइनरी सीरियलाइजेशन यह एक अलग प्रक्रिया है। – DarrenMB

1

आप क्रमबद्धता और deserialization प्रक्रिया को नियंत्रित करने की आवश्यकता होगी। ऐसा करने के लिए आप ISerializable इंटरफ़ेस का उपयोग कर सकते हैं।

पर एक नज़र डालें:

http://msdn.microsoft.com/en-us/library/ty01x675.aspx, वहाँ खंड "ISerializable इंटरफ़ेस को लागू करने" में कुछ उपयोगी जानकारी है।

0

मैंने बाइनरीफॉर्मेटर के वास्तविक कार्यान्वयन को नहीं देखा है। डीरिएरियलाइज() ताकि मैं अनुमान लगा सकूं।

मुझे नहीं लगता कि यह सुनिश्चित करने के लिए deserializer की ज़िम्मेदारी है कि कक्षा के सभी गुण शून्य नहीं हैं। ऐसे कई परिदृश्य हैं जहां शून्य गुण पूरी तरह मान्य हैं और कोई समस्या नहीं है।

अब मैं आपके सवाल का जवाब कर सकते हैं:

मुझे विश्वास है कि एक वर्ग के लिए गुण जोड़ने समस्याओं तथापि का कारण नहीं बनेगा, मुझे लगता है कि प्रॉपर्टी, जिन्हें आपको deserialize करने के लिए प्रयास कर रहे हैं को हटाने जाएगा त्रुटियों का कारण लगता।

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

  • कोई संबंधित समस्या नहीं^_^