2010-07-27 61 views
1

首先,我會給一些背景信息,以便這個問題並非完全沒有背景:在同一個對象存儲多種類型

我寫一個程序,它需要在二進制文件,其中我知道格式讀取/佈局。這些文件的大部分都包含「結構」,每個文件的佈局都存儲在文件頭中。每個結構體都包含可以是結構體或「基本」類型的字段(它們不是結構體,可以是值或參考類型,如floatStringVector3)。

我不需要訪問這些文件中的大部分數據,所以我不必爲當前項目定義所有可能的結構,但是我必須定義手動執行這些操作會很乏味並且耗時。

我的問題是,這些結構中有非常多的數量(2500多個不同的結構,儘管只有文件中出現的結果在該文件的頭文件中定義)。我希望能夠閱讀它們,而不必手動定義每個數據,從而以相同的方式提供所有數據。我現在的想法是,我要創建這樣一個類:


class Struct{ 
    StructDefinition _def; 
    List < Field > _fields; 
    ... 
} 

在現場類,我需要能夠同時存儲結構和基本類型(或更重要的參考和值類型)。有沒有辦法做到這一點,而不是把所有東西都變成object,然後在需要時將它轉換爲正確的類型?此外,這是閱讀這些文件的最佳方式,還是有更好的方法?

+1

讀入文件只是問題的開始。你必須接下來處理它們。假裝你已經將它們讀入你定義的結構中 - 現在編寫處理該結構的代碼 - 查看它是簡單的還是困難的,明顯的還是令人困惑的。您可能會改變主意使用什麼數據結構。 – 2010-07-27 01:06:06

+0

你提出了一個很好的觀點。我沒有想過如何使用它。我想我不得不犧牲一些可用性,如果我不想手動定義的東西。 – 2010-07-27 03:12:24

回答

0

dynamic(.NET 4.0)可以在運行時執行此操作,但會失去編譯時類型安全性和智能感知。

對於您的特定情況,我會推薦.NET 4.0中的新文件映射類。

如果您需要預.NET 4.0解決方案,請考慮將該文件視爲一系列偏移量而不是結構,並使用FileStream,只搜索並只讀取您需要的信息。這有點像一個窮人的文件映射。請注意,在這種情況下,如果您只通過文件前進,則性能更高。

使用上述兩種解決方案中的任何一種,您都不必浪費時間和內存讀取數據,而這些數據您不需要。

+0

這(文件流)將是我的第一選擇,但其中一些結構包含引用和列表。儘管使用偏移量仍然有可能,但它很快就會混淆並且很難調試。 – 2010-07-27 03:01:34

+0

我知道你的意思。一種幫助我的方法是使用文件偏移來重新編寫文件佈局規範(至少是我需要的部分)。例如,如果結構A在幾個「int」之後包含結構B,則重寫它以使得「offset(B)= offset(A)+ 8」。在文件規範被重寫後,然後嘗試編碼。 – 2010-07-27 12:43:10

0

如果您定義了一個包含所有需要操作字段的方法的接口,那麼您可以創建一小組對象 - 一個用於引用,一個用於值類型。
只要這些對象中的每一個實現相同的接口,就可以一般地使用它們。

相關問題