JAVA中的序列化了解

15 篇文章 0 订阅
2 篇文章 0 订阅

                  集合输出到文件中或者从文件输入到控制台上

          Properties集合这个是HashMap集合的子类,这个和集合的存储方式有点不同,它们有泛型,它的存储方法也不是一样的,它是利用setProperty(String 键值,String 值),存储键值和值,再利用store(字节输出流或者字符输出流第二个参数写入的原因基本都是不用写)输出字节将集合里的内容写入文件当中,文件里的内容都是根据键值和值,格式要求很严格,键值=值,在这中间不能有任何的不相干的标点符号和空格,都会引起错误!--将键值和值读入文件中。

      将后缀名为properties的文件输入到控制台显示,就需要用load(字节输入流或字符输入流)输入文件当中内容,System.out.println(放入集合)就可以打印出来,不需要其他的操作!

 

                         对象放入IO流中进行序列化和反序列化

       既然是操作对象的,那肯定也是一种对象输出流-ObjectOutputStream   中的构造器就有一个参数,比如ObjectOutputStream(OutputStream out)  , 这就是一种要将输出流指定的文件当中去。

      上面要是没看懂的话没关系,这里才是重点:

               第一,进行对象写入的时候,我们利用IO流中的字符输出流指定文件,然后利用ObjectOutputStream(这个参数写的就是输出字节流),再然后我将对象传进ObjectOutputStream的对象方WriterObejct(其他类对象)法中,这样就将类的对象输出到了指定的文件当中去了。 ----------》这个写入的就是对象的序列化

              第二,进行对象文件输入的时候,都是一样的,只不过读取对象的返回值也会是对象,这样我们可以用Object来接受,也可以用这个类的对象来接收,不过要进行转型,最后打印显示对象内容!------------------》这个读入的就是对象的反序列化

注意:

     1、当我们进行对象的序列化的时候,写入的文件我们是看不懂的,如果你看的懂的话那就没有必要进行反序列化了,这个我想了想,应该可以弄一个加密解密什么的,这个自己可以做做看。

     2、类中的静态成员变量不能进行序列化,如果是整形那么就是零(0) ,字符串的话那就会是null,这个自己就要注意了!

     3、序列号冲突的问题,当对象已经序列化(输出到文件),也进行反序列化(输入到控制台),这些都可以正常的显示出来,并不会发什么什么问题,但是,你现在要修改源代码中的任意的代码的时候,你不想重新序列化(输出到文件),又进行着读的操作,那么就会发什么错误serialVersionUID =-123, serialVersionUID = -666 就会出现两个不同的序列号产生的冲突,就会报错,这时我们就可以自定义一个序列号来保证每次修改源代码,不进行序列号而直接进行反序号不会产生错误!那怎么定义这个自定义的序列号呢?我们只要添加修饰词static final long  serialVersionUID=123L,这个格式是固定不变的,后面的数字就是自己定义的序列号,JAVA编译的时候看见我们自己定义了序列号那就不会发生改变!

    4、有两种方式可以将我们的属性不设置反序列化,一种是上面讲过的用static静态修饰符,第二种是用transient(暂时的)来修饰当前的变量或者其他的内容,用了这其中的一种方式,进行序列化的时候JAVA编译器就不会将这个其中一种修饰过的内容序列化,读取的时候也是看不到相关的内容的!

       

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值