Как читать и записывать тип SET OF в файл с помощью 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;

Как вы читаете и записываете 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);

Вот тип 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;

Вот как я пытаюсь прочитать и записать тип 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;

Если бы вы могли ответить с примером кода или фактическим кодом, я был бы признателен.

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

Спасибо,


person ThN    schedule 09.09.2011    source источник


Ответы (2)


вы можете сериализовать его как массив байтов; вызовите .ToArray в своей корзине фруктов, чтобы получить его, затем используйте новые фрукты (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);
person Carlo Kok    schedule 09.09.2011
comment
@Ck, спасибо за ответ. Я могу написать, но не прочитать обратно. Он говорит, что не может преобразовать байты в тип данных (Fruits). - person ThN; 09.09.2011
comment
@ CK, я думал, что это работает, но слишком рано сделал выводы. После работы с другими ошибками я, наконец, получил свою программу для компиляции, и теперь она выдает мне ошибки, когда я иду, чтобы прочитать ее обратно из файла. Я могу писать в файл с помощью ToArray, но когда я использую метод readSbyte, он терпит неудачу. Хотя он изначально скомпилировался, в нем были другие ошибки. Так что, я думаю, до этой ошибки дело не доходило до сих пор. Вот почему я еще не принял ваш ответ. - person ThN; 12.09.2011

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

Написать:

thebinarywriter.write(FruitBasket.ToArray);

Читать:

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

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

person ThN    schedule 13.09.2011