【问题标题】:How to read and write "SET OF" type into a file using BinaryWriter?如何使用 BinaryWriter 将“SET OF”类型读写到文件中?
【发布时间】:2011-09-09 16:14:34
【问题描述】:

这是为 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 将 enum SET Type(Fruit) 读写到二进制文件中?我以为我在另一个 Stackoverflow 问题中找到了我的问题的答案,但没有。

我认为,我主要需要遍历它的元素,但我需要知道是否有更简单的方法来做到这一点。

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

顶部的代码只是一个示例。下面是实际代码:

这里是枚举类型:

  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;

如果您能用示例代码或实际代码回答,我将不胜感激。

如果你没有注意到,我为这个问题开始了赏金。我真的需要一个有效的答案。谢谢,

谢谢,

【问题讨论】:

    标签: .net delphi set delphi-prism binarywriter


    【解决方案1】:

    你可以将它序列化为一个字节数组;在你的 FruitBasket 上调用 .ToArray 来获取它,然后使用 new Fruits(myarrayofbyte) 将它作为一组取回。比如:

    var lData := mySet.ToArray(); bw.Write(lData.Length); // 写入长度 bw.Write(lData); // 写入字节 // 阅读: var lData := bw.ReadBytes(bw.ReadInt32()); var newSet := new Fruits(lData);

    【讨论】:

    • @Ck,谢谢你的回答。我能写但不能读回来。它说它不能从字节转换为设置数据类型(水果)。
    • @CK,我认为它有效,但我过早下结论。在解决了其他错误之后,我终于编译了我的程序,现在当我从文件中读回它时,它给了我错误。我可以使用 ToArray 写入文件,但是当我使用 readSbyte 方法时,它会失败。尽管它最初是编译的,但它还有其他错误。所以,我想,直到现在它还没有解决这个错误。这就是为什么我还没有接受你的回答。
    【解决方案2】:

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

    写作:

    thebinarywriter.write(FruitBasket.ToArray);
    

    阅读:

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

    代码已经过测试。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-04-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-04-26
      相关资源
      最近更新 更多