【问题标题】:Can't use .NET's JavaScriptSerializer in Unity and MonoDevelop on MacOS在 MacOS 上的 Unity 和 MonoDevelop 中无法使用 .NET 的 JavaScriptSerializer
【发布时间】:2013-08-29 20:33:57
【问题描述】:

我正在尝试使用 .NET 的 System.Web.Script.Serialization.JavaScriptSerializer 在 MacOS 上使用 MonoDevelop 将 JSON 文件读入 Unity 中的字典。

到目前为止,我已将 System.Web.Extensions 程序集添加到 MonoDevelop 中,这使得它可以很好地构建“Assembly-CSharp”项目。

但是当我回到 Unity 时,它仍然显示错误:错误 CS0234: 名称空间 `System' 中不存在类型或名称空间名称 `Web'。您是否缺少程序集参考?

然后我在网上看到将 DLL 添加到 assets 文件夹的任何位置都可以,所以我在 MonoDevelop 的路径中找到了文件 System.Web.Extensions.dll 的某些版本,它们位于:/Applications/Unity/MonoDevelop.app/Contents/Frameworks/Mono.framework/Versions/2.10.2/lib/mono/gac/System.Web.Extensions

文件有3个不同版本的文件夹:1.0.61025.0__31bf3856ad364e353.5.0.0__31bf3856ad364e354.0.0.0__31bf3856ad364e35

尝试了所有这些,但没有一个有效,Unity给出了这个错误:

Internal compiler error. See the console log for more information. output was:
Unhandled Exception: System.IO.FileNotFoundException: Could not load file or assembly 'System.Web, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a' or one of its dependencies.
File name: 'System.Web, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a'
  at (wrapper managed-to-native) System.Reflection.Assembly:InternalGetType (System.Reflection.Module,string,bool,bool)
  at System.Reflection.Assembly.GetType (System.String name, Boolean throwOnError, Boolean ignoreCase) [0x00000] in <filename unknown>:0 
  at System.Reflection.Assembly.GetType (System.String name) [0x00000] in <filename unknown>:0 
  at Mono.CSharp.RootNamespace.GetTypeInAssembly (System.Reflection.Assembly assembly, System.String name) [0x00000] in <filename unknown>:0 
  at Mono.CSharp.RootNamespace.LookupTypeReflection (Mono.CSharp.CompilerContext ctx, System.String name, Location loc, Boolean must_be_unique) [0x00000] in <filename unknown>:0 
  at Mono.CSharp.GlobalRootNamespace.LookupTypeReflection (Mono.CSharp.CompilerContext ctx, System.String name, Location loc, Boolean must_be_unique) [0x00000] in <filename unknown>:0 
  at Mono.CSharp.Namespace.LookupType (Mono.CSharp.CompilerContext ctx, System.String name, Location loc) [0x00000] in <filename unknown>:0 
  at Mono.CSharp.Namespace.Lookup (Mono.CSharp.CompilerContext ctx, System.String name, Location loc) [0x00000] in <filename unknown>:0 
  at Mono.CSharp.TypeManager.CoreLookupType (Mono.CSharp.CompilerContext ctx, System.String ns_name, System.String name, Kind type_kind, Boolean required) [0x00000] in <filename unknown>:0 
  at Mono.CSharp.TypeManager.InitCoreTypes (Mono.CSharp.CompilerContext ctx) [0x00000] in <filename unknown>:0 
  at Mono.CSharp.Driver.Compile () [0x00000] in <filename unknown>:0 
  at Mono.CSharp.Driver.Main (System.String[] args) [0x00000] in <filename unknown>:0   

那么,现在呢?

【问题讨论】:

  • 自愿将此程序集添加到开源 Mono 项目?
  • 统一标签适用于 Microsoft Unity。请不要滥用它。

标签: monodevelop unity3d javascriptserializer


【解决方案1】:

Unity 使用不支持 .NET 4 的旧版本 Mono。我相信他们也会删除 System.Web.dll 来精简它,因为 System.Web 主要包含与游戏无关的 ASP.NET开发人员。

您也许可以复制 Mono 的 dll,但请确保您使用 v2.0 的 System.Web.dll 和 v3.5 的 System.Web.Extensions.dll。

您也可以尝试 JSON.NET。

【讨论】:

  • 非常感谢!那么,任何 Unity-Mono 内置方式从不涉及经典 fopen fseek 方式的文件中获取数据?也许是 XML 或类似结构的东西。即使是常规的 .ini 文件解析也可以。
  • 不确定,因为我不确切知道 Unity 删除或添加了什么。对于 XML,我假设您可以访问 System.Xml.dll 和 System.Xml.Linq.dll,或者对于类似 ini 的解析,您可以直接使用 System.IO 类,尤其是简单的 System.IO.File.ReadAllLines。
【解决方案2】:

尝试序列化您的数据,BinaryFormatter + MemoryStream + TextAsset

BinaryFormatter + MemoryStream: 对象 字节[]

TextAsset.bytes用于二进制数据文件。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-07
    • 1970-01-01
    • 2014-08-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多