【问题标题】:Unity3D failing to execute Newtonsoft Json codeUnity3D 无法执行 Newtonsoft Json 代码
【发布时间】:2015-09-13 23:53:10
【问题描述】:

我刚刚更新了我的代码加载文件的方式:

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 不兼容? 我应该如何编写才能与 Unity 兼容?

日志:

JsonSerializationException:无法加载程序集“MO1Common”。 Newtonsoft.Json.Serialization.DefaultSerializationBinder.GetTypeFromTypeNameKey (TypeNameKey typeNameKey) Newtonsoft.Json.Utilities.ThreadSafeStore2[Newtonsoft.Json.Serialization.DefaultSerializationBinder+TypeNameKey,System.Type].AddValue (TypeNameKey key) Newtonsoft.Json.Utilities.ThreadSafeStore2[Newtonsoft.Json.Serialization.DefaultSerializationBinder+TypeNameKey,System.Type].Get(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 member, Newtonsoft.Json.Serialization.JsonContainerContract containerContract, Newtonsoft .Json.Serialization.JsonProperty 容器成员,System.String 限定类型名称) 重新抛出为 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 member, Newtonsoft.Json.Serialization.JsonContainerContract containerContract, Newtonsoft .Json.Serialization.JsonProperty 容器成员,System.String 限定类型名称) Newtonsoft.Json.Serialization.JsonSerializerInternalReader.ReadMetadataProperties (Newtonsoft.Json.JsonReader reader, System.Type& objectType, Newtonsoft.Json.Serialization.JsonContract& contract, Newtonsoft.Json.Serialization.JsonProperty member, Newtonsoft.Json.Serialization.JsonContainerContract containerContract, Newtonsoft .Json.Serialization.JsonProperty containerMember, 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 member, 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 contract, Newtonsoft.Json.Serialization.JsonProperty member, Newtonsoft.Json.Serialization.JsonContainerContract containerContract, Newtonsoft .Json.Serialization.JsonProperty containerMember, System.Object existingValue) Newtonsoft.Json.Serialization.JsonSerializerInternalReader.PopulateList(IList 列表,Newtonsoft.Json.JsonReader reader,Newtonsoft.Json.Serialization.JsonArrayContract contract,Newtonsoft.Json.Serialization.JsonProperty containerProperty,System.String id)

【问题讨论】:

  • 您是否尝试过将缺少的程序集 (MO1Common.dll) 引用到项目中?
  • 好的。与一位高级程序员交谈,我现在了解了基本问题。 Unity 不包含我的 Visual Studio 项目中存在的相同程序集库。它只是抓取所有类并创建一个程序集库。有人建议我使用“IfDefs”来解决这个问题。如果可行,我会发布答案。

标签: c# json unity3d


【解决方案1】:

我通过添加以下代码解决了这个问题:

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

这需要将 IfDef "Unity" 添加到统一项目中。

问题是 Json.Net 试图引用我在 Visual Studio 中设置的程序集库“MO1Common”,但是,Unity 将其“脚本”文件夹中的所有类编译到一个名为“大会-CSharp”。在Unity编译代码的时候,简单地替换Json字符串中的程序集库名称就可以解决这个问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-11-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-05
    • 2017-01-31
    • 2015-08-29
    • 1970-01-01
    相关资源
    最近更新 更多