2014-10-30 79 views
7

我想要壓縮一些數據,單是這樣的:無法用單聲道壓縮?

public static string Save(FlightProgram program, bool compressed) 
{ 
    using (MemoryStream ms = new MemoryStream()) 
    { 
     BinaryFormatter f = new BinaryFormatter(); 
     if (compressed) 
     { 
      using (DeflateStream gz = new DeflateStream(ms, CompressionMode.Compress)) 
      { 
       f.Serialize(gz, program); 
      } 
     } 
     else 
     { 
      f.Serialize(ms, program); 
     } 
     return Convert.ToBase64String(ms.ToArray()).Replace('/', '_'); 
    } 
} 

我只是得到了異常「CreateZStream」。沒有內在的例外。這裏發生了什麼 ?

堆棧跟蹤:

Could not save flight program: CreateZStream at at (wrapper managed-to-native) System.IO.Compression.DeflateStream:CreateZStream (System.IO.Compression.CompressionMode,bool,System.IO.Compression.DeflateStream/UnmanagedReadOrWrite,intptr) 
    at System.IO.Compression.DeflateStream..ctor (System.IO.Stream compressedStream, CompressionMode mode, Boolean leaveOpen, Boolean gzip) [0x00000] in <filename unknown>:0 
    at System.IO.Compression.DeflateStream..ctor (System.IO.Stream compressedStream, CompressionMode mode) [0x00000] in <filename unknown>:0 
    at KSPComputerModule.ProgramSerializer.Save (KSPComputer.FlightProgram program, Boolean compressed) [0x00000] in <filename unknown>:0 
    at KSPComputerModule.FPComputer.OnSave (.ConfigNode node) [0x00000] in <filename unknown>:0 (State: None) 
+1

我實際上不知道Unity是如何工作的,但我猜他們看IL代碼並重新編譯/重新鏈接它。也許他們完全不支持System.IO.Compression(請參閱:http://forum.unity3d.com/threads/solved-binary-data-compression-with-deflatestream.31258/) – mbx 2014-10-30 20:52:33

回答

4

我測試過它自己,我得到一個DllNotFoundException:

System.DllNotFoundException: MonoPosixHelper 
    at (wrapper managed-to-native) System.IO.Compression.DeflateStream:CreateZStream (System.IO.Compression.CompressionMode,bool,System.IO.Compression.DeflateStream/UnmanagedReadOrWrite,intptr) 
    at System.IO.Compression.DeflateStream..ctor (System.IO.Stream compressedStream, CompressionMode mode, Boolean leaveOpen, Boolean gzip) [0x00000] in <filename unknown>:0 
    at System.IO.Compression.DeflateStream..ctor (System.IO.Stream compressedStream, CompressionMode mode) [0x00000] in <filename unknown>:0 
    at (wrapper remoting-invoke-with-check) System.IO.Compression.DeflateStream:.ctor (System.IO.Stream,System.IO.Compression.CompressionMode) 

原因似乎是CreateZStream函數,它是應該被內部定義外部方法MonoPosixHelper.dll。

CreateZStream被聲明爲

[DllImport("__Internal", CallingConvention = CallingConvention.Cdecl)] 
private static extern IntPtr CreateZStream(CompressionMode compress, bool gzip, DeflateStream.UnmanagedReadOrWrite feeder, IntPtr data); 

但是文件 「MonoPosixHelper.dll」 不存在。有一個libMonoPosixHelper.dylib似乎實現了CreateZStream的入口點,但是這是一個mac的庫。

就我個人而言,我對Unity中大部分壓縮代碼/庫都有不好的體驗,因爲大多數實現只是簡單地包裝本地代碼庫。根據compatibility page這個類是支持的,但它看起來只有managed part is implementedThis one也似乎驗證。

我已經在很多項目中成功使用了SharpZipLib庫。這是一個純粹的託管庫,沒有本地代碼依賴性。我已經在獨立,網頁,安卓和iOS版本中使用這個庫,沒有任何問題。

6

當然與OP無關......但我終於設法自己解決這個問題。這是Mono for Windows部署中的一個錯誤。如果您從Mono/GtkSharp目錄中刪除MonoPosixHelper.dll文件,您會發現它突然生效。運行進程監視器,你可以看到,而不是去編譯錯誤MonoPosixHelper.dll,它現在去libMonoPosixHelper.dll ...這是編譯正確。

因此,要徹底解決,要麼刪除所有MonoPosixHelper.dll文件,所以它使用libMonoPosixHelper.dll ......或者,最好使用dllmap,加入

<dllmap dll="MonoPosixHelper" target="libMonoPosixHelper.dll" os="windows" /> 

要麼C:\Program Files (x86)\Mono\lib\mono\gac\System\4.0.0.0__b77a5c561934e089\System.dll.config(創建,如果它不已經存在)或全球單聲道配置在C:\Program Files (x86)\Mono\etc\mono\config