자유롭게 질의 및 응답을 할 수 있는 게시판입니다. 개발자 여러분의 답변이 큰 도움이 됩니다.
- 제품설치/등록 오류 문의: 설치/등록 Q&A 이용 (제품 구매 고객 한정)
Delphi TJSONArray Data Clear 문의
2019.11.29 17:16
안녕하세요.
JSON 형식의 데이터를 소켓으로 주고 받는 모듈을 개발 중입니다.
데이터를 주고 받을 때 여러건의 데이터를 JSONArray에 담아서 보관하고 있다가
일정 조건이 만족되면 한꺼번에 보낼려고 합니다.
기존엔 TList를 이용하였었는데
데이터 모듈 생성시에 TList를 생성하고 사용하다가 데이터 모듈 Destroy에서 Free시켜주는 구조로 되어 있습니다.
이것을 JSONArray를 사용하여 똑 같이 하려다보니 데이터를 소켓으로 전송한 다음 보낸 데이터를 제거해야 하는데
데이터를 한번에 지울 수 있는 Clear Procedure가 존재하지 않을 뿐더러 for loop를 돌려 Remove function을 사용하면
문제가 없는 것 처럼 보이지만 JSONArray에 Add 시킨 Object들은 하나도 제거가 안되어 ReportMemoryLeaksOnShutdown
리포트에 무수히 많은 Memory Leak이 보고됩니다.
오버헤드가 많더러도 매번 JSONArray 생성 / 제거 과정을 반복해야하는지
이에 대한 해결책은 없는지요.
구글링을 아무리 해보아도 간단한 사용법만 나와있지 데이터를 클리어 하는 방법은 어디에도 나와있지 않아서
문의 드려봅니다.
감사합니다.
Delphi TJSONArray Data Clear 문의
2019.11.29 17:16
안녕하세요.
JSON 형식의 데이터를 소켓으로 주고 받는 모듈을 개발 중입니다.
데이터를 주고 받을 때 여러건의 데이터를 JSONArray에 담아서 보관하고 있다가
일정 조건이 만족되면 한꺼번에 보낼려고 합니다.
기존엔 TList를 이용하였었는데
데이터 모듈 생성시에 TList를 생성하고 사용하다가 데이터 모듈 Destroy에서 Free시켜주는 구조로 되어 있습니다.
이것을 JSONArray를 사용하여 똑 같이 하려다보니 데이터를 소켓으로 전송한 다음 보낸 데이터를 제거해야 하는데
데이터를 한번에 지울 수 있는 Clear Procedure가 존재하지 않을 뿐더러 for loop를 돌려 Remove function을 사용하면
문제가 없는 것 처럼 보이지만 JSONArray에 Add 시킨 Object들은 하나도 제거가 안되어 ReportMemoryLeaksOnShutdown
리포트에 무수히 많은 Memory Leak이 보고됩니다.
오버헤드가 많더러도 매번 JSONArray 생성 / 제거 과정을 반복해야하는지
이에 대한 해결책은 없는지요.
구글링을 아무리 해보아도 간단한 사용법만 나와있지 데이터를 클리어 하는 방법은 어디에도 나와있지 않아서
문의 드려봅니다.
감사합니다.
이런식으로 코드해주시면 됩니다.
end;
또다른 방법으로 TJsonObjectWriter라는 클래스를 사용하셔도 됩니다. 한번 생성하시고 마지막에 한번 해제하시면 됩니다.
아래와 같이 사용하시면 됩니다.
procedure TBooksResource1.Get(const AContext: TEndpointContext; const ARequest: TEndpointRequest; const AResponse: TEndpointResponse);
const
SQL_LIST ='SELECT BOOK_SEQ, BOOK_TITLE, BOOK_AUTHOR, BOOK_PRICE FROM BOOK';
var
Writer: TJsonObjectWriter;
begin
qryBook.Close;
qryBook.SQL.Text := SQL_LIST;
qryBook.Open;
Writer := TJsonObjectWriter.Create;
try
Writer.WriteStartObject; // start resource
Writer.WritePropertyName('books');
Writer.WriteStartObject; // start item
Writer.WritePropertyName('total');
Writer.WriteValue(qryBook.RecordCount);
Writer.WritePropertyName('book');
Writer.WriteStartArray;
qryBook.First;
while not qryBook.Eof do
begin
Writer.WriteStartObject;
Writer.WritePropertyName('BOOK_SEQ');
Writer.WriteValue(qryBook.FieldByName('BOOK_SEQ').AsInteger);
Writer.WritePropertyName('BOOK_TITLE');
Writer.WriteValue(qryBook.FieldByName('BOOK_TITLE').AsString);
Writer.WritePropertyName('BOOK_AUTHOR');
Writer.WriteValue(qryBook.FieldByName('BOOK_AUTHOR').AsString);
Writer.WritePropertyName('BOOK_PRICE');
Writer.WriteValue(qryBook.FieldByName('BOOK_PRICE').AsString);
Writer.WriteEndObject;
qryBook.Next;
end;
Writer.WriteEndArray;
Writer.WriteEndObject; // end item
Writer.WriteEndObject; // end resource
AResponse.Body.SetValue(Writer.JSON as TJSONValue, True);
except
Writer.Free;
raise;
end;
end;