我刚刚更新了代码加载文件的方式:
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:无法加载程序集&#39; MO1Common&#39;。 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] .Get(TypeNameKey key) Newtonsoft.Json.Serialization.DefaultSerializationBinder.BindToType(System.String assemblyName,System.String typeName) Newtonsoft.Json.Serialization.JsonSerializerInternalReader.ResolveTypeName(Newtonsoft.Json.JsonReader reader,System.Type&amp; objectType,Newtonsoft.Json.Serialization.JsonContract&amp; contract,Newtonsoft.Json.Serialization.JsonProperty member,Newtonsoft.Json.Serialization.JsonContainerContract containerContract ,Newtonsoft.Json.Serialization.JsonProperty containerMember,System.String qualifiedTypeName) Rethrow as JsonSerializationException:在JSON&#39; MO1.Definitions.Entities.Charactor,MO1Common&#39;中指定的错误解析类型。路径&#39; [0]。$ type&#39;,第1行,第57位。 Newtonsoft.Json.Serialization.JsonSerializerInternalReader.ResolveTypeName(Newtonsoft.Json.JsonReader reader,System.Type&amp; objectType,Newtonsoft.Json.Serialization.JsonContract&amp; contract,Newtonsoft.Json.Serialization.JsonProperty member,Newtonsoft.Json.Serialization.JsonContainerContract containerContract ,Newtonsoft.Json.Serialization.JsonProperty containerMember,System.String qualifiedTypeName) Newtonsoft.Json.Serialization.JsonSerializerInternalReader.ReadMetadataProperties(Newtonsoft.Json.JsonReader reader,System.Type&amp; objectType,Newtonsoft.Json.Serialization.JsonContract&amp; contract,Newtonsoft.Json.Serialization.JsonProperty member,Newtonsoft.Json.Serialization.JsonContainerContract containerContract ,Newtonsoft.Json.Serialization.JsonProperty containerMember,System.Object existingValue,System.Object&amp; newValue,System.String&amp; 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 list,Newtonsoft.Json.JsonReader reader,Newtonsoft.Json.Serialization.JsonArrayContract contract,Newtonsoft.Json.Serialization.JsonProperty containerProperty,System.String id)
答案 0 :(得分:1)
我通过添加以下代码来修复此问题:
#If Unity
tempJson = tempJson.Replace("MO1Common", "Assembly-CSharp")
#EndIf
这需要将IfDef“Unity”添加到unity项目中。
问题是Json.Net试图引用我在visual studio中设置的汇编库“MO1Common”,但Unity将其“scripts”文件夹中的所有类编译成一个名为“默认汇编库”的默认汇编库。大会-CSHARP”。在Unity编译代码时,只需在Json字符串中替换程序集库的名称即可解决此问题。