2011-01-24 69 views
0

假設我正在構建UML建模工具。對數據有一些分層組織,模型元素需要能夠引用其他數據。我需要一些方法將模型文件保存到磁盤。如果多個人可能正在同時處理這些文件,那麼合併這些模型文件的時間就來了。另外,比較源代碼管理中的兩個修訂版並查看發生了什麼變化將會很好。這似乎是跨多個域的常見問題設計序列化文件格式的提示,可以輕鬆合併

爲了使用現有的差異和合並工具很好地工作,文件格式應該是文本,並分成多行。

什麼是一些現有的序列化格式,可以很好地解決這些問題(或糟糕的工作)?或者,如果設計自定義文件格式,有哪些提示/準則/陷阱?

獎金問題:如果我想最終將模型分成多個文件,每個文件都是單獨的源代碼控制,那麼還有其他指導意見嗎?

回答

0

一些準則:

格式應設計成當只有一件事的模式發生了變化,只有一個文件中的相應的變化。一些反例:

  • 如果文件格式使用任意參考ID,每次編輯和保存模型時都會更改,這並不好。
  • 如果數組項存儲在顯式列出的索引中,那麼這是不好的,因爲將項插入數組中間會導致所有下列索引被整理。這會導致這些項目不必要地顯示在「差異」中。

關於引用:如果ID是連續創建的,那麼編輯同一版本的模型的兩個人最終可能會創建具有相同ID的新元素。這會在合併時成爲問題。

+0

這裏使用UUID可能是一個好主意。不一定是128位的ID,你也可以使用哈希(用戶名)+串行或類似的東西。 – ordnungswidrig 2011-01-28 08:31:42

1

我很久以前就解決了這個問題的八度/ matlab,現在我需要一些C#。 任務是將兩個八度結構合併爲一個。我發現沒有合併工具,也沒有合適的序列化程序,所以我必須考慮一些事情。

最重要的概念決定是將結構樹分成具有完整路徑和假期內容的行。

基本思想是

  1. 序列化結構來行,其中每一行代表一個基本變量(矩陣,串,浮點,...)
  2. 結構的陣列或矩陣將具有路徑中的索引。
  3. 將兩者連接起來生成的文本文件,排序行
  4. 檢測碰撞並做碰撞處理(很容易,因爲相同的屬性將被直接理解過程相互分揀線後定位)
  5. 做反序列化

實施例:

>> s1 

S1 =

包含字段的標量結構:

b = 

    2x2 struct array containing the fields: 

    bruch 

t = Textstring 
f = 3.1416 
s = 

    scalar structure containing the fields: 

    a = 3 
    b = 4 

將被序列到

root.b(1,1).bruch=txt2base('isfloat|[ [ 0, 4 ] ; [ 1, 0 ] ; ]'); 
root.b(1,2).bruch=txt2base('isfloat|[ [ 1, 6 ] ; [ 1, 0 ] ; ]'); 
root.b(2,1).bruch=txt2base('isfloat|[ [ 2, 7 ] ; [ 1, 0 ] ; ]'); 
root.b(2,2).bruch=txt2base('isfloat|[ [ 7 ] ; [ 1 ] ; ]'); 
root.f=txt2base('isfloat|[3.1416]'); 
root.s.a=txt2base('isfloat|[3]'); 
root.s.b=txt2base('isfloat|[4]'); 
root.t=txt2base('ischar|Textstring'); 

這種方法的優點是,這是很容易實現的,它是人類可讀的。首先你必須編寫兩個函數base2txt和txt2base,將基本類型轉換爲字符串並返回。然後,您只需遞歸遍歷樹,併爲每個struct屬性寫入屬性的路徑(此處由「。」分隔),並將內容寫入一行。

最大的缺點是,至少我的這個實現是非常緩慢的。

對第二個問題的回答:這裏有沒有這樣的東西?我不知道......但我搜索了一段時間,所以我不這麼認爲。

相關問題