Microsoft MVP성태의 닷넷 이야기
익명 클래스 말고 익명 구조체는 불가능한걸까요? [링크 복사], [링크+제목 복사]
조회: 4029
글쓴 사람
Dev Taehui
홈페이지
첨부 파일
 

안녕하세요 다음과 같은 코드를 작성하고 있습니다.

JsonSerializer.SerializeObject(new {
  property1 = 1,
  property2 = "Hello World!"
}); // System.Text.Json 입니다.

이렇게 해서 JSON Text를 얻고 이걸 소켓으로 보내고 있습니다. 그런데 이 과정에서 익명 클래스를 생성할 때 Garbage가 생성되고 있습니다. 게임이라 GC를 최대한 줄여야 합니다.

보다시피 익명 클래스 대신 익명 구조체를 사용한다면 적어도 Object를 생성할 때 쓰레기를 줄일 수 있을 것 같습니다.

하지만 검색을 해봐도 익명 구조체라는 건 찾을 수 없었습니다. 물론 제가 struct를 정의하면 되긴 할텐데 애초에 익명 클래스를 만든 이유가 보내는 구조체에 대한 정의를 일일히 작성하기 싫어서 그런거라 다른 방법이 없을지 궁금합니다.

감사합니다.








[최초 등록일: ]
[최종 수정일: 1/9/2023]


비밀번호

댓글 작성자
 



2023-01-09 01시39분
없습니다. 현재로써는 아시는 것처럼 직접 정의해야 하고, 그나마 귀찮은 타이핑은 record struct로 줄일 수 있는 정도입니다. 필드명이 중요치 않다면 Value 튜플로 우회할 수는 있지만 그런 경우는 거의 없을 테니 현실성이 없고.

아래와 같은 논의가 있었는데,

Discussion: Anonymous struct types #2551
; https://github.com/dotnet/csharplang/discussions/2551

딱히 진전은 없는 것 같습니다. 이참에 "Dev Taehui" 님이 한번 강력하게 ^^ 어필해 보시면 C# 13 정도에는 나올 수 있지 않을까요?
정성태
2023-01-09 02시11분
생각해 보니, 그런 경우 struct를 쓴다고 해서 GC Heap 사용이 없는 것은 아닙니다.

System.Text.Json이라고 했는데, 그 패키지에는 JsonSerializer.SerializeObject가 없습니다. 아마도 JsonSerializer.Serialize를 의미하는 것 같은데, 그 메서드의 인자를 보면 object이기 때문에 struct로 한다고 해도 박싱이 되므로 결국 GC Heap을 사용하게 됩니다.

따라서, 그냥 class를 쓰는 것이 성능상 더 좋습니다.

박싱까지 없애고 싶다면 범용적인 Json 직렬화 클래스를 사용하면 안 되고, 특정 구조체 타입에 맞는 직렬화 클래스를 별도로 만들어서 사용해야 합니다. System.Text.Json의 경우 .NET 6부터 JsonTypeInfo를 이용한 SourceGenerator를 제공하므로,

Serialize<TValue>(TValue, JsonTypeInfo<TValue>)
; https://learn.microsoft.com/en-us/dotnet/api/system.text.json.jsonserializer.serialize#system-text-json-jsonserializer-serialize-1(-0-system-text-json-serialization-metadata-jsontypeinfo((-0)))

그걸 사용해도 좋을 것입니다. 왠지 배보다 배꼽이 더 커지는 듯하지만. ^^;
정성태
2023-01-10 02시33분
[Dev Taehui] 명쾌한 답변 감사드립니다. 크리티컬한 부분에서는 JSON 대신 다른걸로 보내는 것도 생각해보아야겠군요
[guest]
2023-01-10 07시47분
다음의 글을 참고하세요.

.NET 6부터 SourceGenerator와 통합된 System.Text.Json
; https://www.sysnet.pe.kr/2/0/13214
정성태

1  [2]  3  4  5  6  7  8  9  10  11  12  13  14  15  ...
NoWriterDateCnt.TitleFile(s)
5907민성4/21/20233295안녕하세요 서버 백업 문제에 대해서 [2]
5906guest4/21/20233430Dispatcher 서비스 구현 질문 [1]
5905guest4/20/20233741tabControl의 tabPage가 여러 개일 때 순서를 바꾸기가 까다롭네요 [5]
5904guest4/18/20233658[신규자료첨부] DLL 'SQLite.Interop.dll'을 찾을 수 없습니다 [4]파일 다운로드1
5903guest4/18/20233129fileSystemWatcher 이벤트 관련 질문입니다 [2]
5902guest4/17/20233754c#으로 USB 관련 질문 [2]
5901guest4/17/20233324내솔루션 판매 시 1.0.0.0 폴더와 Sqlite 배포 [5]
5900guest4/17/20234483DLL 'SQLite.Interop.dll'을 찾을 수 없습니다 [2]파일 다운로드1
5899guest4/17/20233437Dictionary와 Linq [4]
5898차가워4/17/20233239CNTK 교육 문의 [1]
5897guest4/17/20233173Socket스레드와 UI thread [4]
5896HAN4/16/20233156c언어 return 에 대해 궁금한게 있어요. [1]파일 다운로드1
5895guest4/15/20232910Drag and Drop - 모든 컨트롤 [2]
5894송부장4/14/20234299[질문] Visual Studio 2022에서 '도구 상자 항목 선택'의 'COM 구성 요소' 탭에서 ActiveX 목록이 보이지 않습니다. [3]파일 다운로드2
5893감사합니...4/14/20232911오라클 OLEDB방식 접속 후 SELECT 'TEST' TEST_VALUE FROM DUAL의 값이 이상합니다. [1]
5892한무4/14/20233098C# 으로 백그라운드에서 워드를 실행하여 매크로 실행이 가능 할까요? [2]
5891리세4/14/20232999안녕하세요.C# 서버프로그램에서의 Mysql 쿼리문제(다중쿼리 실행)에 대해 문의드립니다. [2]
5890guest4/14/20233648C# 프리랜서로 돈 벌려면 성태님 책 마스터하면 되나요? [6]
5889전예찬4/14/20232836C# 파일 복사 관련 질문 드립니다. [3]
5888정경구4/12/20233117C# 첫 환경 세팅과 관련해서 [4]
5887HAN4/12/20232749안녕하세요 파이썬도 공유 가능 할까요? [1]
5886guest4/11/20233142필요한 어셈블리만 다운로드 및 재로딩하는 방법에 관하여 [2]
5885guest4/11/20232988c#으로 드림위버같은 거 만들어볼려는데요 [6]
5884궁금이4/11/20232863부모 클래스에서 예외 발생시 힙 영역에 할당 ? [2]
5883코딩초짜4/9/2023276310c언어 usleep 에 대해서 요 [2]
5882조은현4/7/20232820선생님 안녕하세요! wpf의 성능 개선에 대해서 질문드려요! [1]파일 다운로드1
1  [2]  3  4  5  6  7  8  9  10  11  12  13  14  15  ...