2016-01-15 12 views
5

मेरी सार्वभौमिक विंडोज़ अनुप्रयोग में मैं XmlSerializer के माध्यम से एक्सएमएल फ़ाइलों में अपनी वस्तुओं बदलने उपयोगकर्ता डेटा संग्रहीत कर रहा हूँ बनाया जा सकता। System.InvalidOperationException::UWP - System.InvalidOperationException: एक अस्थायी वर्ग (परिणाम = 1) संकलन त्रुटि

एप्लिकेशन संकलन किया गया था, निर्माण और पूरी तरह से रिहाई के लिए (कोड पर किसी भी बदलाव के बिना) किसी भी तरह जब तक चल रहा निर्माण मुझे इस त्रुटि देने के लिए शुरू कर दिया एक अस्थायी वर्ग जनरेट करने में असमर्थ (परिणाम = 1)

अगर मैं निर्माण या एप्लिकेशन डिबग पर यह मैं त्रुटि मिलती है (.NET देशी उपकरण श्रृंखला सक्रिय है) के साथ दोषरहित लेकिन रिहाई पर काम करता है चलाते हैं।

मैं पहले से ही सी पर अनुमति दी: \ Windows \ अस्थायी हर किसी के लिए फ़ोल्डर। यहां तक ​​कि मेरी मां के पास भी इसका उपयोग है लेकिन त्रुटि बनी हुई है।

यह वास्तव में पढ़ने/लिखने समस्या XmlSerializer पर मुझे आश्चर्य है कि किसी भी तरह से UWP परियोजना पर serializer अस्थायी फ़ोल्डर बदलने के लिए है, तो है।

public static async Task<T> ReadObjectFromXmlFileAsync<T>(string filename) 
    { 
     // this reads XML content from a file ("filename") and returns an object from the XML 
     T objectFromXml = default(T); 
     var serializer = new XmlSerializer(typeof(T)); 
     StorageFolder folder = ApplicationData.Current.LocalFolder; 
     StorageFile file = await folder.GetFileAsync(filename).AsTask().ConfigureAwait(false); 
     Stream stream = await file.OpenStreamForReadAsync().ConfigureAwait(false); 
     objectFromXml = (T)serializer.Deserialize(stream); 
     stream.Dispose(); 
     return objectFromXml; 
    } 

    public static async Task SaveObjectToXml<T>(T objectToSave, string filename) 
    { 
     // stores an object in XML format in file called 'filename' 
     var serializer = new XmlSerializer(typeof(T)); 
     StorageFolder folder = ApplicationData.Current.LocalFolder; 
     StorageFile file = await folder.CreateFileAsync(filename, CreationCollisionOption.ReplaceExisting).AsTask().ConfigureAwait(false); 
     Stream stream = await file.OpenStreamForWriteAsync().ConfigureAwait(false); 

     using (stream) 
     { 
      serializer.Serialize(stream, objectToSave); 
     } 
    } 

    //This uses a subfolder 
    public static async Task<T> ReadObjectFromXmlFileAsync<T>(string filename) 
    { 
     // this reads XML content from a file ("filename") and returns an object from the XML 
     T objectFromXml = default(T); 
     var serializer = new XmlSerializer(typeof(T)); 
     StorageFolder folder = ApplicationData.Current.LocalFolder; 
     StorageFolder subFolder = await folder.GetFolderAsync("Notes").AsTask().ConfigureAwait(false); 
     StorageFile file = await subFolder.GetFileAsync(filename).AsTask().ConfigureAwait(false); 
     Stream stream = await file.OpenStreamForReadAsync().ConfigureAwait(false); 
     objectFromXml = (T)serializer.Deserialize(stream); 
     stream.Dispose(); 
     return objectFromXml; 
    } 

मैं क्या याद आ रही है:

यहाँ कोड है कि मैं वस्तुओं को क्रमानुसार करने के लिए इस्तेमाल किया है? क्या कोई मदद कर सकता है?

+0

यदि आप डायग्नोस्टिक स्तर लॉगिंग चालू करते हैं तो अधिक संकेत हो सकते हैं।अगर यह स्पष्ट नहीं है, तो कृपया हमें [email protected] पर मेल करें। एमएलके दिन की छुट्टी के कारण मंगलवार तक लोग कार्यालय में नहीं होंगे। –

+0

मुझे लगता है कि आपके मामले में एक टी temp = डिफ़ॉल्ट (टी) प्रतिबिंब का उपयोग करेगा और .NET मूल संकलक "temp" ऑब्जेक्ट बनाने के लिए जो भी डेटा को क्रमबद्ध करने या deserialize करने की आवश्यकता है उसे पकड़ने का प्रयास करेगा, लेकिन इसके बारे में कुछ भी नहीं जानता, जिसके परिणामस्वरूप एक कबूतर obj.GetType VB.net में मेरे लिए यह करेगा। उस बुरे लड़के को एक डिफ़ॉल्ट प्रकार के बिना एक संस्करण बनाओ और मुझे लगता है कि आप ठीक रहेगा। – sonofsmog

उत्तर

0

आप के साथ एक्सएमएल क्रमबद्धता फ़ाइलों की जा रही किसी भी संयोग से उन में "लिंक के रूप में जोड़ा गया" परियोजनाओं को संदर्भित कर रहे हैं? (यही कारण है कि मेरे मामले में ऊपर उल्लिखित त्रुटि के कारण) यहाँ उस मामले में है ...

... समाधान:

जाहिर है, आप अभी भी कोड साझा करने की "जोड़ा गया लिंक के रूप में" जिस तरह से उपयोग कर सकते हैं, लेकिन उन अस्पष्ट अप्रासंगिक त्रुटियों के बिना ".NET मूल उपकरण श्रृंखला के साथ संकलित" को सक्षम करने के लिए, "लिंक के रूप में जोड़ा गया" फ़ाइलों को कॉलर प्रोजेक्ट पर स्थानांतरित करने की आवश्यकता है।

0

बस इस समस्या में चलने वाले किसी भी अन्य की सहायता के लिए यहां आए। ऐसा लगता है कि जब .NET मूल संकलन कर रहा है तो आप समस्याओं में भाग लेंगे यदि आपके पास कक्षाएं हैं जो एक्सएमएल सीरियलाइज्ड/deserialized होगा जिसमें क्षैतिज एलाइनमेंट और वर्टिकल एलाइनमेंट जैसी चीजों के संदर्भ शामिल हैं। वास्तव में कष्टप्रद, मैं वर्तमान में विजुअल स्टूडियो अपडेट 3 का उपयोग कर रहा हूं और मुझे अभी भी यह समस्या है।

एक बेहतर विवरण के लिए इस ढेर अतिप्रवाह जवाब देखें:

http://stackoverflow.duapp.com/questions/37680536/cant-build-uwp-in-release-mode/37865469#37865469

0

मैं इस लगभग समान कोड के साथ ठीक उसी त्रुटि है:

Public Async Function SerializeObjectToStorage(ByVal obj As Object, ByVal filename As String) As Task(Of Boolean) 
    Dim localFolder As Windows.Storage.StorageFolder 
    Try 
     Dim objStringWriter As New StringWriter 
     Dim x As New XmlSerializer(obj.GetType) 
     x.Serialize(objStringWriter, obj) 
     localFolder = Windows.Storage.ApplicationData.Current.LocalFolder 
     Dim myFile As Windows.Storage.StorageFile = Await localFolder.CreateFileAsync(filename, Windows.Storage.CreationCollisionOption.ReplaceExisting) 
     Dim stream = Await myFile.OpenAsync(Windows.Storage.FileAccessMode.ReadWrite) 
     Using outputStream = stream.GetOutputStreamAt(0) 
      Dim dataWriter As New DataWriter(outputStream) 
      dataWriter.WriteString(objStringWriter.ToString) 
      Await dataWriter.StoreAsync() 
      Await outputStream.FlushAsync() 
      stream.Dispose() 
     End Using 
    Catch ex As Exception 
     Return False 
    End Try 
    Return True 
End Function 
Public Async Function DeserializeStorageToObject(ByVal obj As Object, ByVal filename As String) As Task(Of Object) 
    Dim localFolder As Windows.Storage.StorageFolder 
    Try 
     Dim objStringWriter As New StringWriter 
     Dim x As New XmlSerializer(obj.GetType) 
     x.Serialize(objStringWriter, obj) 
     localFolder = Windows.Storage.ApplicationData.Current.LocalFolder 
     Dim myFile As Windows.Storage.StorageFile = Await localFolder.GetFileAsync(filename) 
     Dim stream = Await myFile.OpenAsync(Windows.Storage.FileAccessMode.Read) 
     Dim size = stream.Size 

     Using inputStream = stream.GetInputStreamAt(0) 
      Dim dataReader As New DataReader(inputStream) 
      Dim numBytesLoaded As UInteger = Await dataReader.LoadAsync(CUInt(size)) 
      Dim text As String = dataReader.ReadString(numBytesLoaded) 
      Using tr = New StringReader(text) 
       obj = x.Deserialize(tr) 
       Return obj 
      End Using 
      stream.Dispose() 
     End Using 
    Catch ex As Exception 
     Return Nothing 
    End Try 
    Return True 
End Function 

मेरा निष्कर्ष है कि वह यह है कि है। नेट नेटिव कंपाइलर वास्तव में उस कोड के साथ क्रमबद्ध करने की कोशिश कर रहे हैं जो भी ऑब्जेक्ट्स को क्रमबद्ध करने की कोशिश कर रहे हैं, जिसे आप क्रमबद्ध करने की कोशिश कर रहे हैं।

Public Class Result 
    Public Property ElementName As String 
    Public Property Id As Integer 
    Public Property Name As String 
End Class 
Public Class GetValues 
    Public Property Count As Integer 
    Public Property Message As String 
    Public Property SearchCriteria As String 
    Public Property Results As Result() 
End Class 

हालांकि, ये ठीक उसी कार्यों एक WCF सेवा से एक डेटा अनुबंध के साथ एक वस्तु को क्रमानुसार करने असफल नहीं: मेरे मामले में प्रकार इस तरह एक साधारण से एक था। तो मुझे लगता है कि शायद इसे आपके प्रकार का एक अवलोकन करने योग्य चयन होना चाहिए। मैंने अभी तक कोशिश नहीं की है। मैं इसे उत्तर के साथ अद्यतन कर दूंगा।

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