2011-09-09 55 views
1

這是德爾福棱鏡。如何使用BinaryWriter將「SET OF」類型讀寫到文件中?

說,我有以下枚舉SET類型,我想保存到一個二進制文件。

Fruit = (Apple, Banana, Mango, Cherry, Grapes, BlueBerry); 
Fruits = set of Fruit; 

FruitBasket:Fruits; 

with Fruit do 
    FruitBasket := [Apple, Mango]; 

BinaryWriter thefile := new BinaryWriter(File.Create("test.dat")); 

thefile.write(FruitBasket); //<<< raises Error - There is no overloaded method "Write" with these parameters 

thefile.Close; 

如何讀取和寫入使用BinaryWriter枚舉SET類型(水果)到二進制文件?我以爲我在另一個Stackoverflow問題中找到了我的問題的答案,但沒有。

我認爲,我大多需要循環其元素,但我需要知道是否有更簡單的方法來完成它。

更新:在第一個答案後,我試了一下,得出了一個快速結論,這是我的一個巨大錯誤。一旦我的程序中出現了其他問題和錯誤,我的編譯器就會根據CK提出的第一個和唯一的答案提出的更改提出錯誤。我只能寫,但不能讀回來。編譯器總是說 - 「類型不匹配,無法將System.SByte分配給Groups.TFeature」

頂部的代碼僅僅是一個示例。下面是實際的代碼:

這裏是枚舉類型:

TFeature = (tfUnit,tfSignal,tfAlarm,tfControl,tfMaker,tfViewer,tfTrend, 
       tfComm,tfSystem,tfScan,tfShutdown,tfPID,tfMagiKal); 

下面是類型的設定:

TFeatures = set of TFeature; 

這裏是類:

TGroup = class 
    name:string; 
    rwFeatures:TFeatures; 
    roFeatures:TFeatures; 
    levels:TLevels; 
    private 

    public 
    constructor; 
    Method ReadAGrp(bgreader:BinaryReader); 
    Method ReadOld(bgreader:BinaryReader); 
    Method WriteAGrp(bgwriter:BinaryWriter); 
    end; 

    TGroupList = class(ArrayList) 
    private 

    public 
    Method ReadGroups(fname:string); 
    Method WriteGroups(fname:string); 
    Method AddGroup(group1:TGroup); 
    Method DeleteGroup(group1:TGroup); 
    Method FindGroup(gname:string):TGroup; 
    end; 

這裏是我如何使用Binarywriter將SET類型讀入和寫入二進制文件:

procedure TGroup.ReadAGrp(bgreader:BinaryReader); 
begin 
    name:=bgreader.ReadString; 
    rwFeatures := TFeature(bgreader.ReadSByte); 
    roFeatures := TFeature(bgreader.ReadSByte); 
    levels := TLevels(bgreader.readsbyte); 
end; 

procedure TGroup.ReadOld(bgreader:BinaryReader); 
begin 
    name:=bgreader.ReadString; 
    rwfeatures := TFeature(bgreader.ReadSByte); 
    roFeatures := TFeature(bgreader.ReadSByte); 
    levels :=TLevels(bgreader.readsbyte); 
end; 

procedure TGroup.WriteAGrp(bgwriter:BinaryWriter); 
begin 
    bgwriter.Write(name); 
    bgwriter.Write(rwFeatures.toarray); 
    bgwriter.Write(roFeatures.ToArray); 
    bgWriter.Write(levels.toarray); 
end; 

如果你可以用示例代碼或實際代碼回答,我將不勝感激。

如果你沒有注意到,我開始了這個問題的賞金。我真的需要一個可行的答案。謝謝,

謝謝,

回答

2

你可以序列化它作爲一個字節數組;在你的FruitBasket上調用.ToArray來獲取它,然後使用新的Fruits(myarrayofbyte)將它作爲一個集合返回。例如:

 
    var lData := mySet.ToArray(); 
    bw.Write(lData.Length); // write the length 
    bw.Write(lData); // write the bytes 

    // Reading: 
    var lData := bw.ReadBytes(bw.ReadInt32()); 
    var newSet := new Fruits(lData); 
+0

@Ck,謝謝你的回答。我能寫,但不能讀回來。它說它不能從字節轉換爲設置數據類型(Fruits)。 – ThN

+0

@ CK,我認爲它工作,但我很快就得出結論。在完成其他錯誤之後,我終於得到了我的程序進行編譯,現在當我從文件中讀取它時,它給了我錯誤。我能夠使用ToArray寫入文件,但是當我使用readSbyte方法時,它會失敗。雖然它最初編譯,但還有其他錯誤。所以,我想,直到現在,它還沒有解決這個錯誤。這就是爲什麼我還沒有接受你的答案。 – ThN

+0

添加了一個樣本。 –

0

基於示例代碼(FruitBasket),代碼如下。

這樣寫:

thebinarywriter.write(FruitBasket.ToArray); 

爲:

Fruits FruitBasket := new Fruits(thebinaryReader.ReadSByte); 

的代碼已經過測試。

相關問題