scala json 序列化与反序列化

本文介绍了在Scala项目中遇到的将Tuple2[String, Map[String, Case class]]对象缓存到Redis的问题。由于环境差异(JDK 1.7 vs JDK 1.8)导致序列化反序列化失败,最终选择了使用JSON格式进行存储。文中提到了使用Fastjson和Gson两个库,并展示了如何将Scala对象转换为Java对象,再进行JSON操作。作者提出自己的过渡解决方案,希望读者分享更优的做法。" 105597344,9242394,Python自动化:打造全功能营销软件,"['Python编程', '自动化工具', 'Android开发', '编程实践', '软件自动化']
摘要由CSDN通过智能技术生成

转[http://blog.csdn.net/pztyz314151/article/details/52958495]

最近是用Scala开发了一个项目,其中有个环节需要将类似Tuple2[String, Map[String, Case class]]对象作为中间结果缓存至Redis中。

中间对象结构如下:

case class TestDO(var id :Int = 0, var value : String = null)
case class Test2DO(var arrayBuffer: ArrayBuffer[TestDO] = null)
Tuple2[String, Map[String, Test2DO]]

 tuple2是需要缓存的数据结构

缓存redis,第一时间想到的是序列化,序列化与反序列化代码如下

/**
    * 序列化
    * @param obj
    * @return
    */
  def serialize(obj: Object): Array[Byte] = {
    try {
      val baos = new ByteArrayOutputStream();
      val oos = new ObjectOutputStream(baos);
      oos.writeObject(obj)
      val array: Array[Byte] = baos.toByteArray
      oos.close()
      baos.close()
      array
    }
    catch {
      case e: Exception =>
        println(e)
        null
    }
  }

/**
    * 反序列化
    * @param bytes
    * @return
    */
  def deSerialize(bytes : Array[Byte]) :Object ={
    try{
      val bais = new ByteArrayInputStream(bytes)
      val ois=new ObjectInputStream(bais)
      val obj=ois.readObject()
      bais.close()
      ois.close()
      obj
    }catch {
      case e: Exception =>
        println("deSerialize" + e)
        null
    }
  }

 在本机的开发测试过程中,序列化这个很完美,没有出现丝毫任何错误。但是当我丢到集群环境运行行,出现了大量反序列化的错误,说无法找到Test2DO这个class。各种查错,最后发现集群环节是jdk 1.7,而本机开发环境是jdk1.8。初步觉得可能是这个原因导致的~~~然后验证了,结论就不在此阐述了。

考虑到开发部署的方便性,最后选择将中间结果以json的格式缓存至redis。这个时候便开始用scala转json了。

第一个是阿里开源出来的fastjosn,第二个是gson,感觉都不错.maven 中的依赖如下:

<dependency>
      <groupId>com.alibaba</groupId>
      <artifactId>fastjson</artifactId>
      <version>1.1.36</version>
    </dependency>

    <dependency>
      <groupId>com.google.code.gson</groupId>
      <artifactId>gson</artifactId>
      <version>2.3.1</version>
    </dependency>

 演示过程:

单个case calss 
这里写图片描述

arraybuffer 
这里写图片描述

输入
val gson = new Gson()
    println(gson.toJson(Test2DO(ArrayBuffer(TestDO(1, "12"), TestDO(1, "12"), TestDO(1, "12")))))

输出
{"arrayBuffer":{"initialSize":16,"array":[{"id":1,"value":"12"},{"id":1,"value":"12"},{"id":1,"value":"12"},null,null,null,null,null,null,null,null,null,null,null,null,null],"size0":3}}

 Map,Set, List等类似

相信大家已经看出了跟javabean对象tojson之后的不一样,因为项目周期的原因,博主这边做了一个土鳖的方法,将上述scala对象全部转出了Java对象进行tojson保存至redis之中,然后在取出json转化成javabean对象在转化成scala 对象进行了过渡处理。希望大家在使用过程中注意,或者有其他解决方案也希望亲能给我留言,期待完美方案。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值