2013-01-09 66 views
2

我經常遇到這個問題,但我還沒有找到令人滿意的解決方案。原語的序列化

我正在實現一個savegames閱讀器(但它也可以應用於其他類型的文件)。取決於版本,還有一些添加的條目,但順序始終保持不變。所以我創建了一個類:

public class Entry<T> { 
    public T Value; 
    public readonly FileVersion MinVersion; 
    public Entry(T v = default(T), ScenarioVersion m = FileVersion.V115) { 
     Value = v; 
     MinVersion = m; 
    } 
} 

現在,你猜,我想用盡可能少的代碼編寫那些條目。我只想寫一行if (version >= MinVersion) { /* write data */ }。這些條目可以是原始類型或對象,這是問題...

應該定義一個接口併爲每個需要的基本類型實現它作爲包裝?還是有更優雅的解決方案?

+0

原諒我的無知,但究竟是什麼問題?原始類型可以在C#中序列化。如果你想在那裏序列化更多的控制,看看http://stackoverflow.com/questions/628843/byte-for-byte-serialization-of-a-struct-in-c-sharp。 – akton

+0

我看不出如何解決以下兩個問題:1.某些值只在符合某些條件時才寫入,2.它不是靜態結構幷包含一些諸如'struct {int len;炭[長度]; }'。 – AKo

+0

目前還不清楚問題是什麼。我會嘗試一個答案,但也許這個問題中的一個或兩個例子是最好的。 – akton

回答

1

(在具體問題的意見看。)

如果一定條件滿足某些值僅寫入。

在讀取/寫入文件時或讀取文件時,是否知道這些條件是基於文件中的其他數據?如果前者(已知)傳入Func<bool>,那麼讀取或寫入操作必須評估爲true。調用者可以提供一個適當的委託或lambda方法來做出決定。你在問題中提到最低版本。我認爲這是一個例子。

如果後者(值是根據文件中的其他數據讀取/寫入的),這是一個更廣泛的問題。如果可以在文件的早期或已知位置做出決定,則加載它並將適當的參數傳遞給Func。否則,您可能需要查看更復雜的解析機制,但我認爲這不是您要求的。

它不是一個靜態結構幷包含一些像struct {int len;炭[長度]; }。

.Net提供了多種序列化對象的方法,但我懷疑您想要以定義的格式進行讀取/寫入,例如將字符串存儲爲長度後接8位字符。如果.Net機制不能做你想做的事,你可能需要自己寫。有關這方面的更多信息,請參閱Byte for byte serialization of a struct in C#,其中包括使用Marshal來獲取基元的基礎字節。

另外,如果您想避免編寫原始類型,可以使用public class Entry<T> where T: class