Firebase 行为发生变化取决于构建程序的内容

Firebase behavior changing Depending on what built the program

我正在尝试使用 Firesharp 在现有的 .Net 程序中实施 Firebase。 Firebase 用于将在一台机器上更改的信息传播到其他机器,这些机器之前可能加载了相同的信息。

我试图让 Firebase 将对象的 JSON 表示存储为特定键的值。

当我在 VS 2013 中构建并在本地 运行 程序时,值如下所示:

正如您在图片中看到的,作为值的 JSON 字符串对其所有特殊字符进行了转义,键“-Kkvvz8vdPqvZWDmNgHf”的值是单个字符串。虽然我意识到这可能不是预期的结构,但由于订阅通过 Firesharp 工作的方式,目前这种结构最适合我们的实施。

以上行为是我在本地 PC 上通过我的开发环境进行编译时看到的,每天晚上我们都使用 TeamCity 来编译包含前几天更改的程序,当编译代码时我收到完全不同的行为火力地堡:

图片基本上显示了 Firebase 正在采用对象的 JSON 表示并将其属性分解为树中的各个节点。因此,程序对节点“288110_280”的订阅正在接收多个更新,每个 属性 一个更新,而不是一个代表需要处理的更改对象的更新。我们已经验证了 TeamCity 的配置模仿了我们的开发环境,并且我已经对安装结束时最终出现在应用程序文件夹中的 dll 以及在我的开发环境中完成的构建输出进行了一对一检查,并且dll 完全匹配。

所以我的主要问题是,

  1. 是什么决定了 Firebase 是否解析给定的 JSON 字符串?
  2. 如果 Firebase 确实将 JSON 解析为单独的属性,是否可以订阅父节点,以便我们接收包含所有属性的更新而不是单独的属性?
  3. 有没有办法强制 Firebase 按照第一个屏幕截图中的概述行事?

**编辑:

我认为 Teamcity 的不一致是一个转移注意力的问题。我能够在两台不同的机器上安装由 Teamcity 编译的程序。一个产生第一个结果,一个产生第二个结果。所以这个新信息基本上改变了我如何确保跨不同机器的行为一致的问题?

好的,我已经在不使用调试器的情况下尽可能多地解析了源代码。这是我发现的:

  • 你上面给出的例子是转义字符串双引号。它看起来不像是在逃避其他任何事情。这让我相信,当 Firebase 获取字符串有效负载时,它会尝试解析为 JSON 并抛出无效的 \ 转义标记。然后 Firebase 存储为一个字符串。如果 " 未转义,Firebase 会成功解析为 JSON 对象。

  • 通过 Firesharp 进行追踪将我带到这个 String formating code 让我停下来。我的第一个怀疑是 as string 在一个系统上工作而不在另一个系统上工作。但是,如果不在两台不同的机器上通过调试器来遵循格式,我将沿着 _config.Serializer.Serialize 路径走下去。

  • 原来 _config.Serializer.Serialize 方法最终使用 TextWriter 来构建字符串。 TextWriter 使用系统的 CultureInfo(语言环境)来帮助确定字符串的构建方式。

可以在机器之间改变的是语言环境 (CultureInfo)。我知道 TeamCity 在系统帐户上启动构建代理,该帐户可能具有也可能不具有相同的语言环境。

我可能会使用以下代码来测试这个理论:

  CultureInfo culture1 = CultureInfo.CurrentCulture;
  CultureInfo culture2 = Thread.CurrentThread.CurrentCulture;
  Console.WriteLine("The current culture is {0}", culture1.Name);
  Console.WriteLine("The two CultureInfo objects are equal: {0}",
                    culture1 == culture2);

您可以使用 wire format 发送 Teamcity 消息。例如

Console.WriteLine("##teamcity[message 'The current culture is {0}' ]", culture2.Name);

如果隐含CultureInfo,则取系统文化。我怀疑它们要么不同,要么不变。不要使用不变或隐含文化,而是尝试设置显式文化,看看是否能解决您的问题。