2011-08-08 2 views
2

C#에서 object [] []를 압축해야합니다. Gzip comrepss - 바이트 압축 해제를 사용할 수 있지만 그런 경우 어떻게 할 수 있습니까? 변환C#에서 Object [] []를 압축하는 방법

+2

배열에 어떤 종류의 객체가 있습니까? 직렬화가 가능하다면 직렬화 한 다음 GZip으로 결과를 압축 할 수 있습니다. 직렬화 할 수없는 경우 압축을 수행 할 일반 또는 표준 방법이 없습니다. – driis

+0

더 많은 정보를 제공해야합니다. 그러한 방법의 결과는 무엇입니까? 해당 배열에는 어떤 종류의 객체가 있습니까? 가치 유형 또는 참조 유형입니까? 또는 둘 다입니까? – Joe

답변

3

이진 직렬화를 사용하여 바이트 배열로 변환 한 다음 압축합니다. 배열의 모든 객체가 serializable이면 다음을 수행 할 수 있습니다.

object[][] objects = new[] {new[] {"a"}}; 
BinaryFormatter formatter = new BinaryFormatter(); 
using (MemoryStream memoryStream = new MemoryStream()) 
using (GZipStream gZipStream = new GZipStream(File.OpenWrite("C:\\zipped.zip"), 
    CompressionMode.Compress)) 
{ 
    formatter.Serialize(gZipStream, objects); 
} 

//unzipping 
using (GZipStream gZipStream = new GZipStream(File.OpenRead("C:\\zipped.zip"), 
    CompressionMode.Decompress)) 
{ 
    objects = (object[][])formatter.Deserialize(gZipStream); 
    Console.WriteLine(objects[0][0]); //a 
} 
+0

+1 deserialize 할 프로세스 [/ code]는? (완성을 위해) –

+0

@pst 완료, 그리고 한계가 싫어. –

+0

고마워. 정확히 내가 무엇을 찾고 있었는지. – Cannon

2
  1. 를 A byte[]
  2. 압축에 object[][]byte[]

1 단계 어려운 부분이며, 그들이 byte[]들로 변환 할 수 있도록 모든 객체 직렬화 것을 요구합니다 .

이 까다로운 이유는 object[]의 내용을 메모리에 다양한 object의 단지 메모리 참조가 실제로, 그 object들도 마찬가지로 다른 object들에 대한 참조를 가질 수 있다는 것입니다. 일부는 할당 된 I/O 포트와 같은 특정 시스템 리소스를 참조 할 수도 있습니다. 이 컴퓨터는 객체에 동일한 리소스를 할당하지 않았기 때문에 이와 같은 객체를 다른 컴퓨터로 전송하는 것은 당연한 일입니까? 따라서 클래스에서 바이트 스트림으로 serialize 및 deserialize 할 수 있다고 명시 적으로 지정하지 않은 경우에는이를 수행 할 수 없습니다.

관련 문제