Unity3d 将Unity预置/场景反序列化为键/值对的嵌套哈希表

Unity3d 将Unity预置/场景反序列化为键/值对的嵌套哈希表,unity3d,yamldotnet,Unity3d,Yamldotnet,我正试图编写一个工具,扫描我们的Unity(2017.4.22)预置和场景文件,以查找发布版本中不存在的MonoBehavior属性。我创建了一个c#控制台项目(合并了YamlDotNet 6.1.2),从这个项目中我引用了Unity的“Assembly CSharp firstpass.dll”和“Assembly CSharp.dll”dll 我想知道是否有人能够将YamlDotNet配置为将任何给定的预置/场景文件解析为内存中的通用键/值数据结构(具有任意数量的嵌套级别),以便我可以迭代它

我正试图编写一个工具,扫描我们的Unity(2017.4.22)预置和场景文件,以查找发布版本中不存在的MonoBehavior属性。我创建了一个c#控制台项目(合并了YamlDotNet 6.1.2),从这个项目中我引用了Unity的“Assembly CSharp firstpass.dll”和“Assembly CSharp.dll”dll

我想知道是否有人能够将YamlDotNet配置为将任何给定的预置/场景文件解析为内存中的通用键/值数据结构(具有任意数量的嵌套级别),以便我可以迭代它并使用反射来确定字段是否存在

如果您想知道为什么我需要手动执行此操作,那是因为我正在扫描发布版本中不存在的字段。唯一的方法是重新编译“Assembly CSharp firstpass”和“Assembly CSharp”,并删除UNITY_EDITOR(以及“EDITOR”子文件夹中文件中的所有代码)。我不能在编辑器中这样做(显然),所以这就是为什么它必须是一个独立的工具

我所做的一切都导致了车祸。以下是我尝试过的:

  • 我下载了YamlDotNet 6.1.2源代码
  • 尝试使用反序列化(…)反序列化预设。收到此错误:“遇到未解析的标记‘tag:unity3d.com,2011:1’”
  • 然后我找到了这个自定义类型的解析器,我集成了它:
  • 然后我开始接收此异常:“反序列化期间异常-->System.InvalidOperationException:未能创建“UnityEngine.GameObject”类型的实例”
  • 我猜这是因为我试图在一个不完全支持游戏对象的环境中实例化一个游戏对象(毕竟我是在一个独立的C#项目中)

    但我实际上不需要实例化任何游戏对象。我只想解析这些值。这对任何人都有意义吗?我在这里发现了一些其他的问题,但它们似乎不能处理与Unity的预置一样复杂的YAML文件

    提前感谢,,
    杰夫你的猜测是对的。由于您正在将
    标记:unity3d.com,2011:
    标记解析为
    UnityEngine.GameObject
    和相关类型,因此反序列化程序在遇到标记时会尝试创建相应类型的实例

    您可以选择始终将标记解析为
    字典
    (或者
    字典
    ,如果键不总是字符串)。然后总是要买字典

    在您的例子中,使用
    YamlDotNet.RepresentationModel.YamlStream
    加载YAML流可能更简单。这将为您提供更适合您的用例的YAML文档表示

    以下是如何做到这一点的官方示例:


    谢谢我昨晚睡不着觉,无意中发现了你网站上的示例代码。所以现在我有点尴尬:D
    // Load the stream
    var yaml = new YamlStream();
    yaml.Load(input);
    
    // Examine the stream
    var mapping = (YamlMappingNode)yaml.Documents[0].RootNode;