如何使用BinaryWriter将“SET OF”类型读入和写入文件?

时间:2011-09-09 16:14:34

标签: .net delphi set delphi-prism binarywriter

这适用于Delphi Prism。

说,我有以下枚举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 Type(Fruit)读入和写入二进制文件?我以为我在另一个Stackoverflow问题中找到了我的问题的答案,但没有。

我认为,我主要是要遍历其元素,但我需要知道是否有更简单的方法。

更新:在第一个回答之后,我尝试并快速得出结论,这对我来说是一个巨大的错误。一旦我解决了我的程序中的其他问题和错误,我的编译器就我所做的更改出现了错误,这是由第一个和唯一的CK回答。我只能写但不能读回来。编译器一直说 - “类型不匹配,无法将System.SByte分配给Groups.TFeature”

顶部的代码只是一个例子。以下是实际代码:

这是Enum类型:

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

这是SET OF类型:

  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 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 个答案:

答案 0 :(得分:2)

你可以将它序列化为一个字节数组;在你的FruitBasket上调用。然后使用新的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);

答案 1 :(得分:0)

基于示例代码(FruitBasket),代码如下。

写:

thebinarywriter.write(FruitBasket.ToArray);

阅读:

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

代码已经过测试。