将对象序列化成为一个byte数组

前几天在做项目的过程中用到了memcached缓存部分数据来缓解数据库的读取压力,
但是死活存不进去,首先怀疑自己是不是哪里用错了,但是查看代码并没有什么不妥之处,
当时还在怪memcached怎么这么二,居然自己不会序列化一个对象,
同事说他用byte数组将一些图片存放进去过,于是我就想如何将我所要存储的对象转化为
byte数组,于是开始了我的第一次序列化之旅。
首先这次序列化不是将对象存储到本地文件中去,而是转化成byte[]存放到缓存中去,
经过查找资料,终于找到了以下这段代码,将一个可序列化的对象转换成byte[]的方法

序列化:
ByteArrayOutputStream obj = new  ByteArrayOutputStream();
try
{
    ObjectOutputStream out = new ObjectOutputStream(obj);
    out.writeObject(this);
    return obj.toByteArray();
            
} catch (IOException e)
{    
    e.printStackTrace();
}
反序列化:
ByteArrayInputStream bin = new ByteArrayInputStream((byte[])objs);
try
{
    ObjectInputStream obin = new ObjectInputStream(bin);
    Object  obj = obin.readObject();
}
catcch(Exception e)
{
    e.printStackTrace();
}
费了很大劲,将所有代码都从新改过一遍,发现还是不行,同时我也发现了代码结构的问题
改动一处需要改动几乎整个工程的代码。于是我开始了痛苦的重构过程。。。
但是序列化的问题还是要解决的,但是在本人代码上改动我已经无能为力了
于是想到了membase是基于memcache的,是不是他们会互相影响呢,打开系统服务查看,发现membase和memcached
都在运行着,于是结束了membase的进程,从新写入,发现居然成功了。。。。。
顺便多了解了关于序列化的一些知识
一般实现serializable接口的时候都会生成一个序列化版本号,这个版本号的作用是,比如说,在最开始的时候你存进去了一个版本号为
1l的对象,改过代码后你的版本号已经变成了2l,但是缓存并没有清理,这时候你在取出此类的对象并强制转化的时候就会抛出一个异常
主要就是因为版本号不相符的原因。所以如果序列化的对象能够反序列化,他们的版本号必须是一样的
2 序列化的时候私有成员是不受保护的,除非将成员声明为transientde
3.在序列化的时候类静态成员是不会被序列化的,因为序列化的只是某个对象,而不是某个类
4.如果多次序列化同一个对象,比如序列化两次,那么存储序列化的空间并不会加倍,而只是增加很少的几个字节,java序列化机制会自动处理
序列化时引用的问题.
  • 5
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值