2011-09-09 6 views
1

これはDelphi Prism向けです。BinaryWriterを使ってファイルに "SET OF"型を読み書きするには?

私はバイナリファイルに保存したい次の列挙型を持っています。

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を使用してバイナリファイルに列挙セットタイプ(果物)を読み、書くのですか?私は別のStackoverflowの質問で私の質問への答えを見つけたが、しなかったと思った。

私は主にその要素をループする必要があると思いますが、それを実行する簡単な方法があるかどうかを知る必要がありました。

更新:最初の回答の後、私は試してみると、早急に結論に至りました。これは私の間違いでした。いったん私のプログラムで他の問題やエラーが見つかったら、私のコンパイラは最初に提案された変更とCKによる唯一の答えに誤りを出しました。私は書くことができますが、それを読むことはできません。コンパイラは「タイプミスマッチ、グループ.TFeatureのセットにSystem.SByteを割り当てることはできません」と発言し続けています。

コードは一例です。以下、実際のコードである:ここ

は、列挙型である:ここ

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; 

私はバイナリファイルを使用してバイナリファイルにSET OF型を読み書きしようとしています:

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); 

コードがテストされています。

関連する問題