2012-10-17 3 views
0

저는 UsageData 클래스를 바이트 배열로 저장하고 하드웨어 키에 저장하려고합니다. 이 하드웨어 키는 사용자 데이터에 대해 최대 256 바이트를 예약했습니다. 현재 속성이있는 채워진 클래스에는 이미 압축 된 640 바이트 크기가 있습니다. 이제 모든 속성/fiels없이 임시 클래스 UsageDataTemp을 만들었습니다. 테스트를 실행하여 바이트 배열이 어떤 값없이 얼마나 큰지 확인하고 이미 220 바이트의 크기를 가지며 채우기 위해 36 바이트 만 남겨 둡니다.어떤 값도없이 클래스를 바이트 배열로 변환하는 것은 이미 내 256 개의 사용 가능한 바이트 중 220 바이트를 포함합니다.

[Serializable] 
    public class UsageDataTemp 
    { 
     public byte[] ToByteArray() 
     { 
      var formatter = new BinaryFormatter(); 
      using (var stream = new MemoryStream()) 
      { 
       //original serialization is 684 bytes long, compress it with the gzipstream 
       using (var compressionStream = new GZipStream(stream, CompressionMode.Compress)) 
       { 
        formatter.Serialize(compressionStream, this); 
        compressionStream.Flush(); 
        return stream.ToArray(); 
       } 
      } 
     } 
    } 

값이없는 빈 클래스가 이미 자체 저장을 위해 220 바이트를 필요로하는 이유는 무엇입니까? 바이트 배열을 더 압축하는 방법이 있습니다. 또는 내 자신을 만들기 시작해야합니까 BinaryFormatter.

답변

2

당신은 어떤 유형의 객체를 상대하는지 시리얼 라이저/디시리얼라이저에 말하지 않습니다. 아무 것도 전달할 수없고 "잘 작동"해야합니다.

즉, 어떤 형식의 정보가 이진 스트림에 저장되어 어떤 형식의 개체가 deserialize되는지 확인해야한다는 것을 의미합니다. 220 바이트의 오버 헤드를 쉽게 생각할 수 있습니다.


모든 바이트 수 있다면, 그래, 당신은 바이너리 시리얼 당신이 최소한의 표현에 이르기까지 관심있는 데이터를 변환하기 위해 자신의 코드를 작성하기보다는 일반적인 메커니즘을 사용되어야한다 .

0

구조를 serialize 할 필요가 없습니다. 필요한 것은 하드웨어 키에 바이트를 저장하는 것입니다. Object Factory 패턴을 사용하여 256 바이트 배열이 UsageData 객체를 만들고 뭔가가 UsageData 객체에서 256 바이트 배열을 가져 오는 것을 구현할 수 있습니다.

1

값이없는 빈 클래스가 이미 자체 저장을 위해 220 바이트를 필요로하는 이유는 무엇입니까?

왜 찾을 수 있습니까? 이 코드는 이미 33 바이트를 산출합니다 :

FileStream fs = new FileStream("Serialized.dat", FileMode.Create); 
BinaryFormatter formatter = new BinaryFormatter(); 
formatter.Serialize(fs, "FooString"); 

더 많은 문자열이 문자열 자체보다 직렬화되기 때문에 이미 33 바이트가 생성됩니다. 객체를 직렬화하면 클래스 정의 (및 객체가 들어있는 어셈블리)도 직렬화됩니다. 이 클래스의 인스턴스를 직렬화 다음 FooString 재산권 이전 직렬화 원료 문자열과 동일한 데이터를 포함하는 동안

[Serializable] 
class Foo 
{ 
    public String FooString { get; set; } 
} 

는 166 바이트를 요한다.

그래서 자신의 직렬화 (또는 :로드/저장) 논리를 작성하십시오. 데이터를 읽고 쓰는 사람은 당신입니다. 예를 들어, 공간의 특정 바이트를 클래스의 특정 속성에 할당 할 수 있습니다.