2017-05-24 87 views
0

我試圖在使用Firesharp的現有.Net程序中實現Firebase。正在使用Firebase將一臺計算機上更改的信息傳播到其他可能具有先前加載的相同信息的計算機上。Firebase行爲改變取決於構建的程序

我試圖讓Firebase存儲對象的JSON表示作爲特定鍵的值。

當我建立在VS 2013和本地運行該程序,則值出現像這樣:

Desired behavior

正如你可以在圖片中看到的JSON字符串,它是價值在於它的所有特殊字符轉義並且鍵「-Kkvvz8vdPqvZWDmNgHf」的值是單個字符串。雖然我意識到這可能不是預期的結構,但在這一點上,由於訂閱通過Firesharp工作的方式,此結構最適合我們的實現。

以上行爲是我在本地PC上通過我的開發環境進行編譯時看到的結果,每天晚上我們都會使用TeamCity編譯前一天的更改以及編譯代碼的代碼時,我在Firebase中接收到完全不同的行爲:

wrong behavior

圖片本質上示出了火力地堡走的是對象的JSON表示和打破其屬性,在樹中單個節點。因此,程序對節點「288110_280」的訂閱正在接收多個更新,每個屬性一個,而不是代表需要處理的更改對象的一個​​更新。我們已經驗證了TeamCity的配置模擬了我們的開發環境,並且我已經在安裝結束時在應用程序文件夾中執行了1對1的dll檢查,並在我的開發環境中完成了構建的輸出,並且該dll完全匹配。

所以我的主要問題是,

  1. 什麼決定了火力地堡是否解析JSON字符串,它被賦予?
  2. 如果Firebase確實將JSON解析爲單個屬性,是否有可能以這樣的方式訂閱父節點:我們將收到一個包含所有屬性的更新,而不是單獨的屬性?
  3. 有沒有一種方法可以強制Firebase按照第一個屏幕截圖中的說明操作?

**編輯:

我相信TeamCity的不一致是一個紅色的鯡魚。我能夠在兩臺獨立的機器上安裝Teamcity編譯的程序。一個產生第一個結果,一個產生第二個結果。所以這個新的信息基本上改變了問題,我如何確保跨不同機器的一致行爲?

+0

你如何逃避JSON字符串?你的目標是什麼.Net版本,所有的機器都是最新的.Net? https://msdn.microsoft.com/en-us/library/hh925567(v=vs.110).aspx –

+0

我正在生成未轉義的JSON字符串,並已驗證這是什麼被傳遞到Firesharp轉義在傳遞給Firesharp的JSON字符串時(有時)正在完成,我無法確定它是由Firesharp還是由Firebase完成。我們的目標是4.5.1,我們要求將4.5.1安裝在任何運行我們程序的PC上。 –

回答

1

好吧,我已經解析了儘可能多的源代碼,因爲我可以站在不使用調試器。這是我發現的:

  • 上面給出的例子是轉義字符串雙引號。它看起來不像是在逃避其他任何事情。這使我相信,當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的是隱含的,它需要的制度文化。我懷疑他們是不同的,或者他們是不變的。不要使用不變或隱含的文化,而是嘗試設置明確的文化,以查看是否能解決您的問題。

+0

鑑於我在編輯原始問題時看到的行爲,我相信您可能會在文化理念的正確軌道上。通過將第一個'{'轉換爲'<',然後在嘗試反序列化值之前在客戶端恢復它,我可以強制執行此行爲。所以它有效,但不是很乾淨。稍後我會更多地關注文化理念,但現在我認爲這是最好的選擇。 –