Unity3d 将Unity预置/场景反序列化为键/值对的嵌套哈希表
我正试图编写一个工具,扫描我们的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”子文件夹中文件中的所有代码)。我不能在编辑器中这样做(显然),所以这就是为什么它必须是一个独立的工具 我所做的一切都导致了车祸。以下是我尝试过的: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配置为将任何给定的预置/场景文件解析为内存中的通用键/值数据结构(具有任意数量的嵌套级别),以便我可以迭代它
杰夫你的猜测是对的。由于您正在将
标记: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;