2015-09-13 13 views
1

我剛剛更新了我的代碼加載一個文件的方式:Unity3D未能exicute Newtonsoft的Json代碼

string filename = Path.Combine(Data.BaseDir, "entities.txt"); 
if (File.Exists(filename)) 
{ 
    string tempJson = System.IO.File.ReadAllText(filename); 
    var settings = new JsonSerializerSettings() 
    { 
     TypeNameHandling = TypeNameHandling.Objects 
    }; 
    IList parsedEntities = (IList)JsonConvert.DeserializeObject<List<Entity>>(tempJson, settings); 
    foreach (Entity e in parsedEntities) 
    { 
     //e.Initialise(); 
     Map.Get(e.Coord).Entity = e; 
    } 
} 

此代碼編譯但隨後在Unity 5編輯器運行時異常。 (下面的日誌) 這段代碼碰巧和我的編輯器很相似,它是一個windows窗體項目,當它由visual studio編譯時它運行良好。 我的Newtonsoft.Json.dll說它是版本7.

這是Unity編譯器的問題嗎? Newtonsoft Json DLL的某些部分是否與.Net的unities版本不兼容? 我應該如何編寫這個以兼容Unity?

日誌:

JsonSerializationException:無法加載組件 'MO1Common'。 Newtonsoft.Json.Serialization.DefaultSerializationBinder.GetTypeFromTypeNameKey(TypeNameKey typeNameKey) Newtonsoft.Json.Utilities.ThreadSafeStore 2[Newtonsoft.Json.Serialization.DefaultSerializationBinder+TypeNameKey,System.Type].AddValue (TypeNameKey key) Newtonsoft.Json.Utilities.ThreadSafeStore 2 [Newtonsoft.Json.Serialization.DefaultSerializationBinder + TypeNameKey,System.Type的]獲得(TypeNameKey鍵) Newtonsoft.Json。 Serialization.DefaultSerializationBinder.BindToType(System.String assemblyName,System.String typeName) Newtonsoft.Json.Serialization.JsonSerializerInternalReader.ResolveTypeName(Newtonsoft.Json.JsonReader reader,System.Type & objectType,Newtonsoft.Json.Serialization.JsonContract & contract, Newtonsoft.Json.Serialization.JsonProperty成員,Newtonsoft.Json.Serialization.JsonContainerContract containerContract,Newtonsoft.Json.Serialization.JsonProperty containerMember,System.String qualifiedTypeN ame) Rethrow as JsonSerializationException:在解析JSON'MO1.Definitions.Entities.Charactor,MO1Common'中指定的類型時出錯。路徑'[0]。$ type',第1行,位置57. Newtonsoft.Json.Serialization.JsonSerializerInternalReader.ResolveTypeName(Newtonsoft.Json.JsonReader reader,System.Type & objectType,Newtonsoft.Json.Serialization.JsonContract & contract, Newtonsoft.Json.Serialization.JsonProperty成員,Newtonsoft.Json.Serialization.JsonContainerContract containerContract,Newtonsoft.Json.Serialization.JsonProperty containerMember,System.String qualifiedTypeName) Newtonsoft.Json.Serialization.JsonSerializerInternalReader.ReadMetadataProperties(Newtonsoft.Json.JsonReader reader, System.Type & objectType,Newtonsoft.Json.Serialization.JsonContract &合約,Newtonsoft.Json.Serialization.JsonProperty成員,Newtonsoft.Json.Serialization.JsonContainerContract containerContract,Newtonsoft.Json.Serialization.JsonProperty co ntainerMember,System.Object existingValue,System.Object & newValue,System.String & id) Newtonsoft.Json.Serialization.JsonSerializerInternalReader.CreateObject(Newtonsoft.Json.JsonReader reader,System.Type objectType,Newtonsoft.Json.Serialization.JsonContract contract ,Newtonsoft.Json.Serialization.JsonProperty成員,Newtonsoft.Json.Serialization.JsonContainerContract containerContract,Newtonsoft.Json.Serialization.JsonProperty containerMember,System.Object existingValue) Newtonsoft.Json.Serialization.JsonSerializerInternalReader.CreateValueInternal(Newtonsoft.Json.JsonReader reader ,System.Type objectType,Newtonsoft.Json.Serialization.JsonContract合約,Newtonsoft.Json.Serialization.JsonProperty成員,Newtonsoft.Json.Serialization.JsonContainerContract containerContract,Newtonsoft.Json.Serialization.JsonProperty containerMember,System.Object existingValue) Newtonsoft.Json.Serialization.JsonSerializerInternalReader.PopulateList(IList列表,Newtonsoft.Json.JsonReader讀者,Newtonsoft.Json.Serialization.JsonArrayContract契約,Newtonsoft.Json.Serialization。JsonProperty containerProperty,System.String ID)

+0

你有沒有嘗試引用缺少的程序集(MO1Common.dll)到項目? – AgentFire

+0

好的。與一位高級程序員交談,我現在明白了基本問題。 Unity不包含Visual Studio項目中存在的相同的Assembly庫。它只抓取所有的類並創建一個裝配庫。我被建議通過使用「IfDefs」來解決這個問題。如果它有效,我會發布答案。 –

回答

0

我解決了這個問題通過添加以下代碼:

#If Unity 
tempJson = tempJson.Replace("MO1Common", "Assembly-CSharp") 
#EndIf 

這就需要添加IFDEF 「團結」,以統一的項目。

問題是Json.Net試圖引用我在Visual Studio中設置的組裝庫「MO1Common」,但是Unity將其「scripts」文件夾中的所有類編譯爲一個名爲「彙編CSHARP」。在Unity編譯代碼時,只需替換Json字符串中的程序集庫的名稱即可解決此問題。