2013-05-12 45 views
2

我一直在建立一個網絡繪畫程序,其中用戶的藝術作品的狀態保存爲json對象。每次我添加到客戶端的撤消堆棧(只是描述項目狀態的json對象數組)時,我也想將狀態保存到服務器。將項目保存爲增量json差異?

我想知道是否有一個優雅的方式[1]只發送差異,然後[2]能夠稍後下載項目並重新創建項目的當前狀態?我擔心這可能會變得混亂,並且趨向於在每個撤消步驟上載完整的json項目狀態。任何建議或指向優雅地解決這類問題的項目?

回答

2

有趣的 - 和相當大的問題。 許多實現/模式/解決方案適用於這個問題,它們根據您跟蹤更新的「文檔」類型而有所不同。 無論如何,避免生氣的一個簡單方法是,不是保存「狀態」,而是保存「生成這些狀態的命令」。

如果您的應用程序是完全確定的(我認爲是這樣,因爲它是一個繪畫程序),你可以肯定的是在給定的時間&位置的每一個命令,結果將在每次執行相同。

所以,我反而記下一個 「字母」,代表你的程序中可用的命令:

  • 平局X,Y,大小,顏色]
  • 擦除[X,Y,大小]
  • 將[X,Y]

等。您可以從SVG實施中獲得靈感。然後向/從服務器推/拉字符串命令:

timestamp: MOVE[0,15]DRAW[15,20,4,#000000]ERASE[4,8,10]DRAW[15,20,4,#ff0000] 

這顯然只是一個普遍的,僞代碼的想法。希望你能得到一些啓發。