2017-09-09 23 views
14

में टाइप 'System.Collections.Generic.List`1' नहीं मिला। मैं C# unity3d में किसी ऑब्जेक्ट को क्रमबद्ध और deserialize करने का प्रयास कर रहा हूं। इसके लिए मैं नीचे दिए गए कोड का उपयोग कर रहा हूं। लेकिन मुझे नीचे उल्लिखित त्रुटि मिल रही है। जब मैं फाइल करने के लिए बचाने वस्तु को क्रमानुसार और फ़ाइल से लोड करते समय मैं बाहर खेल रोक के साथ खेल खेल रहा हूँसीरियलाइजेशन अपवाद: सी # unity3d

Error: SerializationException: Could not find type 'System.Collections.Generic.List`1[[ABC, Assembly-CSharp, Version=1.0.2.18931, Culture=neutral, PublicKeyToken=null]]'.

यह नहीं हो रहा है।

लेकिन त्रुटि तब होती है जब मैं गेम को रोकता हूं और कोड की किसी भी पंक्ति को बदलता हूं (धारावाहिक और deserialization के लिए अप्रासंगिक) और पहले सहेजी गई फ़ाइल से डेटा लोड और deserialize करने की कोशिश कर रहा है मुझे SerializationException मिल रहा है।

मैं दृश्य स्टूडियो संपादक और unity3d संस्करण का उपयोग कर रहा 5.5.4

मैं कुछ बहुत ही सरल बात याद आ रही हो सकता है। क्या कोई इसे हल करने में मेरी मदद कर सकता है।

धन्यवाद।

public static string SerializeObject<T>(T objectToSerialize) 
{ 
    BinaryFormatter bf = new BinaryFormatter(); 
    MemoryStream memStr = new MemoryStream(); 

    try 
    { 
     bf.Serialize(memStr, objectToSerialize); 
     memStr.Position = 0; 

     return Convert.ToBase64String(memStr.ToArray()); 
    } 
    finally 
    { 
     memStr.Close(); 
    } 
} 

public static T DeserializeObject<T>(string str) 
{ 
    BinaryFormatter bf = new BinaryFormatter(); 
    bf.Binder = new CurrentAssemblyDeserializationBinder(); 
    byte[] b = Convert.FromBase64String(str); 
    MemoryStream ms = new MemoryStream(b); 

    try 
    { 
     return (T)bf.Deserialize(ms); 
    } 
    finally 
    { 
     ms.Close(); 
    } 
} 

कक्षा मैं उपयोग कर रहा हूँ:

public sealed class CurrentAssemblyDeserializationBinder : SerializationBinder 
{ 
    public override Type BindToType(string assemblyName, string typeName) 
    { 
     Version assemVer1 = Assembly.GetExecutingAssembly().GetName().Version; 
     Debug.Log("ASSEM VER: " + assemVer1 + "--NAME--" + assemblyName + " --OVERAL-- " + Assembly.GetExecutingAssembly().FullName + " --TYPE-- " + typeName); 
     //assemblyName = Assembly.GetExecutingAssembly().FullName.Replace(assemVer1.ToString(), "1.0.2.23455"); 
     //string assemblyNameCustom = "Assembly-CSharp, Version=1.0.2.18931, Culture=neutral, PublicKeyToken=null"; 

     bool isList = false; 

     if (typeName.Contains("List`1")) 
      isList = true; 
     // other generics need to go here 

     if (isList) 
      return Type.GetType(string.Format("System.Collections.Generic.List`1[[{0}, {1}]]", "ABC", "Assembly-CSharp, Version=1.0.2.18931, Culture=neutral, PublicKeyToken=null")); 
     else 
      return Type.GetType(string.Format("{0}, {1}", assemblyName, typeName)); 

    } 

} 

लेकिन मैं एक ही अपवाद और BindToType में लॉग हो रही है कभी नहीं छपा है:

[Serializable] 

    public class ABC : ISerializable 
    { 
    public SerializableDictionary<int, ExampleClass> a = new SerializableDictionary<int, ExampleClass>(); 

    public GameObject b; 
    public GameObject c; 
    public bool d = false; 
    public ABC e; 
    public int f; 
    public string g = ""; 
    public int h = -1; 
    public int i = -1; 
    public int j = -1; 
    public string k = "default"; 
    public XYZ l = XYZ.P; 
    } 

    [Serializable] 
    public enum XYZ 
    { 
     P, 
     Q 
    } 


    [Serializable()] 
    public class ABCListWrapper : ISerializable 
    { 

    public List<ABC> abcMappings = new List<ABC>(); 
    public string version = "1.53"; 
    public float interval; 
    } 


    //Serilization 
    abcLW = new ABCListWrapper(); 
    abcW = getABCListWObj(); 
    string abcWString = SerializeObject(abcW); 
    File.WriteAllText(Application.streamingAssetsPath + "/filename.json", abcWString); 


    //Deserilization call 
    ABCListWrapper l = new ABCListWrapper(); 
    string l_1 = File.ReadAllText(Application.streamingAssetsPath + "/filename.json"); 
    l = DeserializeObject<ABCListWrapper>(l_1); 

समस्या को हल करने का प्रयास। तो इसका मतलब है BindToTypeSerilizationBinder में फ़ंक्शन BindToType

+0

कृपया उस कक्षा को पोस्ट करें जिसे आप इसका उपयोग करने का प्रयास कर रहे हैं। यह भी दिखाएं कि आप इन कार्यों को कैसे कॉल कर रहे हैं और जहां त्रुटि हो रही है। – Programmer

+0

कोई तरीका है कि मैं आपको निजी रूप से फाइल भेज रहा हूं क्योंकि इसकी एक तृतीय पक्ष संपत्ति मैं उपयोग कर रहा हूं और मैं इसे यहां सीधे पोस्ट नहीं कर सकता – djkp

+0

मैं एक फाइल नहीं मांग रहा हूं। जिस श्रेणी में आप serizele/deserialize की कोशिश कर रहे हैं और आप इस कक्षा – Programmer

उत्तर

9

बाइनरी फॉर्मेटर धारावाहिक प्रकार के साथ असेंबली संस्करण जानकारी संग्रहीत कर रहा है। तो जब भी प्रकार बदल नहीं जाता है, तब भी जैसे ही असेंबली अपडेट हो जाती है, क्रमशः क्रमिकरण/deserialization बदल जाता है।

विवरण के लिए यह संबंधित प्रश्नोत्तर देखें: Binary Deserialization with different assembly version और the relevant MSDN article

आम तौर पर मैं इसे बंद वोट हैं इस डुप्लीकेट के रूप में है, लेकिन मैं खुले इनाम की वजह से नहीं कर सकते हैं, तो मैं बजाय जवाब देने के लिए फैसला किया है;)

+0

समस्या को हल करने के प्रयास के साथ प्रश्न संपादित किया गया, जो एक ही त्रुटि दे रहा है, कृपया इसे – djkp

+0

@djkp पर देखें जहां आप 'CurrentAssemblyDeserializationBinder' का उपयोग करते हैं? 'बीएफ।बाइंडर = नया CurrentAssemblyDeserializationBinder() 'आपके अपडेट किए गए कोड में नहीं है। – grek40

+0

क्षमा करें कि अपडेट करते समय मेरी गलती मैंने इसे जोड़ा, धन्यवाद :) – djkp

0

तेजी से बाइनरी क्रमांकन Protocol Buffers के लिए अच्छा विकल्प हो सकता है। इसके अलावा यह संगतता समस्याओं को हल करना चाहिए (आप फ़ील्ड ऑर्डर/बहिष्करण को मैन्युअल रूप से नियंत्रित कर सकते हैं)

+0

लेकिन प्रोटोकॉल बफर एकता 'GameObject' डेटा प्रकार के साथ काम नहीं कर रहा है, क्या आपने इसे कॉल के साथ प्रयास किया था – djkp

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