2011-09-09 6 views
1

이것은 Delphi Prism을위한 것입니다.BinaryWriter를 사용하여 "SET OF"유형을 읽고 쓸 수있는 방법은 무엇입니까?

말하자면, 이진 파일에 저장하려는 다음 열거 형 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); 

유형의 집합입니다 : 여기

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; 

: 여기

TFeatures = set of TFeature; 

는 클래스입니다 다음은 실제 코드는 내가 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

당신은 바이트의 배열로 serialize 할 수 있습니다; 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); 

코드가 테스트되었습니다.