SerializationException Unity中BinaryFormatter反序列化错误

SerializationException: The ObjectManager found an invalid number of fixups. This usually indicates a problem in the Formatter.

下面是错误示范:
保存二进制:

			AssetBundleConfig config = new AssetBundleConfig();
        //string bytePath = "Assets/GameData/Data/ABData/AssetBundleConfig.bytes";
        //FileStream fs = new FileStream(bytePath, FileMode.OpenOrCreate, FileAccess.ReadWrite, FileShare.ReadWrite);
        //BinaryFormatter bf = new BinaryFormatter();
        //bf.Serialize(fs, config);
        //fs.Close();

读取二进制:

  BinaryFormatter bf = new BinaryFormatter();
        MemoryStream stream = new MemoryStream(textAsset.bytes);
        AssetBundleConfig config = (AssetBundleConfig)bf.Deserialize(stream);
        stream.Close();

最后改进方案:

//保存为二进制
private static void SaveBin(AssetBundleConfig config)
    {
        try
        {
            string path = "Assets/GameData/Data/ABData/AssetBundleConfig";
            FileStream file = null;
            BinaryFormatter bf = new BinaryFormatter();
            file = File.Open(path, FileMode.Create);
            bf.Serialize(file, config);
            file.Close();
        }
        catch (System.Exception ex)
        {
            Debug.LogError("存储失败----" + ex.Message);
        }
        //string.IsNullOrEmpty(path):基本等价与path==null||path.length==0::没用到,但想到。

    }
    // 读取二进制
        public AssetBundleConfig OpenBin()
    {
        string path = "Assets/GameData/Data/ABData/AssetBundleConfig";
        AssetBundleConfig config = null;
        FileStream file = null;
        BinaryFormatter bf = new BinaryFormatter();
        file = File.Open(path, FileMode.Open);
        config = (AssetBundleConfig)bf.Deserialize(file);
        file.Close();
        return config;
    }
    
Redis的官方未提供Hessian序列化反序列化模块,但可以通过使用开源的Java Hessian库实现Hessian序列化与反序列化。使用步骤如下: 1. 下载Java Hessian库,将jar包添加到Java项目的classpath。 2. 创建Hessian序列化工具类,将对象序列化成字节数组: ``` import com.caucho.hessian.io.HessianInput; import com.caucho.hessian.io.HessianOutput; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.IOException; public class HessianSerializer { public static byte[] serialize(Object obj) throws IOException { ByteArrayOutputStream baos = new ByteArrayOutputStream(); HessianOutput output = new HessianOutput(baos); output.writeObject(obj); return baos.toByteArray(); } public static Object deserialize(byte[] bytes) throws IOException { ByteArrayInputStream bais = new ByteArrayInputStream(bytes); HessianInput input = new HessianInput(bais); return input.readObject(); } } ``` 3. 在Redis设置Hessian序列化: ``` import org.springframework.data.redis.serializer.RedisSerializer; import org.springframework.data.redis.serializer.SerializationException; public class HessianRedisSerializer implements RedisSerializer<Object> { @Override public byte[] serialize(Object obj) throws SerializationException { if (obj == null) { return new byte[0]; } try { return HessianSerializer.serialize(obj); } catch (IOException e) { throw new SerializationException("Hessian serialize error", e); } } @Override public Object deserialize(byte[] bytes) throws SerializationException { if (bytes == null || bytes.length == 0) { return null; } try { return HessianSerializer.deserialize(bytes); } catch (IOException e) { throw new SerializationException("Hessian deserialize error", e); } } } ``` 4. 在Redis配置文件设置Hessian序列化: ``` spring.redis.serializer=com.example.redisserializer.HessianRedisSerializer ``` 以上就是Redis实现Hessian序列化反序列化的简单实现方式。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值