单声道无法压缩?

pix*_*ist 7 c# mono deflatestream unity-game-engine

我试图压缩像单声道这样的一些数据:

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('/', '_');
    }
}
Run Code Online (Sandbox Code Playgroud)

我只是得到异常"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)
Run Code Online (Sandbox Code Playgroud)

Jef*_*eff 6

肯定与OP不相关......但我终于设法解决了这个问题.这是Mono for Windows部署中的一个错误.如果你MonoPosixHelper.dll从Mono/GtkSharp目录中删除文件,你会突然发现它有效.运行进程监视器,您可以看到,而不是进行编译错误MonoPosixHelper.dll,它现在适用于libMonoPosixHelper.dll......正确编译.

因此,要永久解决,请删除所有MonoPosixHelper.dll文件,使其使用libMonoPosixHelper.dll ...或者,最好使用dllmap,添加

 <dllmap dll="MonoPosixHelper" target="libMonoPosixHelper.dll" os="windows" />
Run Code Online (Sandbox Code Playgroud)

要么C:\Program Files (x86)\Mono\lib\mono\gac\System\4.0.0.0__b77a5c561934e089\System.dll.config(如果它不存在则创建),要么是全局Mono配置C:\Program Files (x86)\Mono\etc\mono\config


Bun*_*y83 5

我自己测试过,得到一个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)
Run Code Online (Sandbox Code Playgroud)

原因似乎是CreateZStream函数,它是一个外部方法,应该在MonoPosixHelper.dll中定义.

CreateZStream声明为

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

但是文件"MonoPosixHelper.dll"不存在.有一个libMonoPosixHelper.dylib似乎实现了CreateZStream的入口点,但是这是一个用于mac的库.

我个人对Unity中的大多数压缩代码/库都有不好的经历,因为大多数实现只是包装一个本机代码库.根据兼容性页面,该类受支持,但看起来只有托管部分才能实现.这个似乎也验证了这一点.

我在很多项目中成功使用了SharpZipLib库.它是一个没有本机代码依赖性的纯托管库.我在独立,web,android和iOS版本中使用这个库没有任何问题.