각 구조체에는 3 바이트의 데이터로 구성된 14,400,360 개의 구조체 배열이 있습니다. 고정 크기 버퍼의 직렬화
[ProtoContract]
struct A
{
[ProtoMember(1)]
private unsafe fixed byte[3] data;
}
불행하게도 protobuf - 그물 2.0.0.668은 고정 된 크기의 버퍼를 직렬화 및 직렬화에 예외를 throw 할 수 없다. ("FixedArray에 대한 serializer 없음"과 같은) 대답은 here으로 설명됩니다.
현재 해결 방법은 고정 배열을 세 개의 개별 바이트로 분할하고 레이아웃을 고정하는 것입니다.
[ProtoContract]
[StructLayout(LayoutKind.Explicit, Size = 3, CharSet = CharSet.Ansi)]
struct A
{
[ProtoMember(1)]
[FieldOffset(0)]
private byte data;
[ProtoMember(2)]
[FieldOffset(1)]
private byte data1;
[ProtoMember(3)]
[FieldOffset(2)]
private byte data2;
}
Q : 어떤 마술 해킹 또는 그냥 일반 트릭 내가 밖으로 누락 있는가, 수동으로 배열을 분할 나는 가지고 있지 않은거야?
이 배열을 포함하는 개체의 힙 사용량을 측정 할 때 43201,160 바이트 또는 구조체 당 3 바이트를 차지합니다. 디스크의 직렬화 된 파일은 struct 당 72,814,584 바이트 또는 약 5.05 바이트를 차지합니다.
Q : 구조체 당 여분의 2 바이트를 차지하는 것은 무엇입니까? 시도한 적은 없지만 대신 3 * 14,400,360 바이트의 배열을 만들어 직렬화 된 크기를 줄일 수 있습니까?
편집 (최후의 수단을 넘어) : 수정 직렬화 된 파일의 크기는 126,246,995 바이트 구조체 당 8.8 바이트 대신 원래보고 구조체 당 5.5 바이트이었다.
편집 : 후속 this answer에서 단일 회원 트릭을 사용하여 90,952,228 바이트 구조체 당 6.3 바이트까지 파일 크기를 가져왔다.