티스토리 뷰
[C# / Unity] 서버-클라이언트 통신 시 데이터가 null이 되는 이유: JsonSerializer vs JsonUtility
멀티플레이 오목 게임을 개발하다가 C# 콘솔 기반 데디케이티드 서버와 유니티 클라이언트 간에 패킷을 주고받는데 필드값이 null이나 0으로 초기화되는 현상이 생겼다.
.NET의 JsonSerializer와 유니티의 JsonUtility의 다른점 때문이었는데
첫번째는
- JsonSerializer: 기본적으로 프로퍼티({ get; set; }) 기반. 객체 지향의 캡슐화 원칙을 지키기 위해 외부로 노출된 인터페이스인 프로퍼티만 직렬화하고 내부 변수(필드)는 무시합니다.
- JsonUtility: 성능 최적화를 위해 필드(Field) 기반으로 작동합니다. public으로 선언된 변수나 [SerializeField]가 붙은 필드만 취급하며, 오히려 프로퍼티는 무시해 버립니다.
두번째는
- JsonSerializer: 별도 설정이 없으면 C# 변수명이 대문자라도 JSON 키 값을 소문자로 시작하는 camelCase(userId)로 변환하여 내보내는 경우가 많습니다.
- JsonUtility: 대소문자를 엄격하게 구분합니다. JSON에는 userId라고 적혀 있는데 유니티 클래스에 UserId라고 되어 있다면, "나랑 이름이 다르네?"라며 데이터를 매칭하지 않고 null을 할당합니다.
서버에서 사용하는 JsonSerializer가 필드는 무시하고 대문자 필드 역시 camelCase로 변환 시켜버렸다
덕분에 필드 기반 프로토타입 패킷은 서버에서 정상 패킷을 받아도 역직렬화하는 과정에서 나의 경우에는 UserId를 null로 만들어버리고 거기에 더해서 보내는 패킷의 필드명 나의 경우엔 { Message : "..." } 를 자기 맘대로 { message : "..." } 로 보내서 대소문자를 구분하는 유니티 클라이언트의 JsonUtility에서 읽지 못했다.
해결방법은 패킷을 아예 프로퍼티 기반으로 변경하거나 JsonSerializerOptions로 옵션을 정해주고 패킷을 읽거나 보내는 방법.


직렬화 혹은 역직렬화 시 JsonSerializerOptions 매개변수가 추가된 오버로딩 메서드를 호출하면 된다.
'Network' 카테고리의 다른 글
| OSI 7 Layer (0) | 2025.03.18 |
|---|
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
링크
TAG
- 렌더링파이프라인
- 카카오코딩테스트
- Unity Package Manager
- 개발모듈
- ModernC++
- 코딩테스트
- trailing return type
- 이진 변환 반복하기
- C#
- STL컨테이너
- STL
- 유니티기초
- 팩토리메서드패턴
- 유니티
- 유니티6
- RenderingPipeline
- Event
- 유니티패키지
- modern C++
- Algorithm
- emplace
- dfs
- 알고리즘
- unity6
- UnionFind
- 문자열정수변환
- C++
- range based for
- initializer_list
- delegate
| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | 2 | 3 | 4 | 5 | ||
| 6 | 7 | 8 | 9 | 10 | 11 | 12 |
| 13 | 14 | 15 | 16 | 17 | 18 | 19 |
| 20 | 21 | 22 | 23 | 24 | 25 | 26 |
| 27 | 28 | 29 | 30 |
글 보관함
