Как читать и записывать тип «SET OF» в файл с помощью BinaryWriter? - PullRequest
1 голос
/ 09 сентября 2011

Это для Призмы Дельфи.

Скажем, у меня есть следующий тип набора enum, который я хотел бы сохранить в двоичном файле.

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;

Как прочитать и записать enum SET Type (Fruit) в двоичный файл с помощью BinaryWriter? Я думал, что нашел ответ на свой вопрос в другом вопросе Stackoverflow, но не нашел.

Я думаю, что я в основном должен пройтись по его элементам, но мне нужно было знать, есть ли более простой способ сделать это.

ОБНОВЛЕНИЕ: После первого ответа я попытался и быстро пришел к выводу, что было огромной ошибкой с моей стороны. Как только у меня были другие проблемы и ошибки в моей программе, мой компилятор выдавал ошибки на изменениях, которые я сделал, как предложено первым и единственным ответом CK. Я могу только писать, но не могу читать обратно. Компилятор продолжает говорить: «Несоответствие типов, невозможно назначить System.SByte для набора Groups.TFeature»

Код сверху - только пример. Ниже приведен актуальный код:

Вот тип Enum:

  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 в двоичный файл, используя Binarywriter:

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 ]

2 голосов
/ 09 сентября 2011

вы можете сериализовать его как массив байтов;вызовите .ToArray на FruitBasket, чтобы получить его, затем используйте новые фрукты (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 голосов
/ 13 сентября 2011

На основе примера кода (FruitBasket) код выглядит следующим образом.

Написать:

thebinarywriter.write(FruitBasket.ToArray);

Читать:

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

Код был протестирован.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...