经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » Java相关 » Scala » 查看文章
scala case class + BeanProperty+fastjson 快速实现类的序列化与反序列化
来源:cnblogs  作者:feiquan  时间:2020/11/9 16:08:57  对本文有异议

在实际的开发中,我们往往需要定义大量的类结构,来实现面向对象式的数据管理。考虑一种场景,这种场景下单个类管理的类成员变量有很多个,我们如何实现在少量代码编写的情况先实现一个类的序列化?

1. 在Java 中要实现一个类的序列化,需要 implements Serializable ,这个类需要是 OPJO 。那么在scala 中,我们知道 BeanProperty 会帮我们实现 get/set 方法,可以极大的缩减代码量

2. 序列化我们使用 alibaba 的fastjson

  1. <dependency>
  2. <groupId>com.alibaba</groupId>
  3. <artifactId>fastjson</artifactId>
  4. <version>1.2.47</version>
  5. <scope>compile</scope>
  6. </dependency>

 

1. 首先我们看下java 中如何实现:

  1. package java_demo;
  2. import java.io.Serializable;
  3. public class Students implements Serializable {
  4. //姓名
  5. private String name;
  6. //年龄
  7. private String age;
  8. //住址
  9. private String address;
  10. public Students() {
  11. }
  12. public Students(String name, String age, String address) {
  13. this.name = name;
  14. this.age = age;
  15. this.address = address;
  16. }
  17. @Override
  18. public String toString() {
  19. return "Students{" +
  20. "name='" + name + '\'' +
  21. ", age='" + age + '\'' +
  22. ", address='" + address + '\'' +
  23. '}';
  24. }
  25. public String getName() {
  26. return name;
  27. }
  28. public void setName(String name) {
  29. this.name = name;
  30. }
  31. public String getAge() {
  32. return age;
  33. }
  34. public void setAge(String age) {
  35. this.age = age;
  36. }
  37. public String getAddress() {
  38. return address;
  39. }
  40. public void setAddress(String address) {
  41. this.address = address;
  42. }
  43. }
Students

使用fastjson 序列化:

  1. package java_demo;
  2. import com.alibaba.fastjson.JSONObject;
  3. public class ToJson {
  4. public static void main(String[] args) {
  5. System.out.println("---------- Class Students --------");
  6. // object -> json
  7. Students s = new Students("wang","10","beijing");
  8. String objStr = JSONObject.toJSONString(s);
  9. System.out.println(objStr);
  10. // json -> object
  11. Students js = JSONObject.parseObject(objStr, Students.class);
  12. System.out.println(js);
  13. }
  14. }

output:

  1. ---------- Class Students --------
  2. {"address":"beijing","age":"10","name":"wang"}
  3. Students{name='wang', age='10', address='beijing'}

 


2. 再来看下scala 中如何实现:

1. 手动实现 get/set:

  1. package scala_demo
  2. class Students {
  3. var name: String = _
  4. var age: String = _
  5. var address: String = _
  6. def this(name: String, age: String, address: String) {
  7. this() // 调用主构造函数
  8. this.name = name
  9. this.age = age
  10. this.address = address
  11. }
  12. def getName(): String = this.name
  13. def getAge(): String = this.age
  14. def getAddress(): String = this.address
  15. def setName(name: String) = this.name = name
  16. def setAge(age: String) = this.age = age
  17. def setAddress(address: String) = this.address = address
  18. override def toString: String = {
  19. this.getClass.getSimpleName + s"{name:'$name',age:'$age',address:'$address'}"
  20. }
  21. }
Students

2. 使用BeanProperty实现

  1. package scala_demo
  2. import scala.beans.BeanProperty
  3. class BeanStudents {
  4. @BeanProperty var name: String = _
  5. @BeanProperty var age: String = _
  6. @BeanProperty var address: String = _
  7. // 必须实现构造函数
  8. def this(name: String, age: String, address: String) {
  9. this()
  10. this.name = name
  11. this.age = age
  12. this.address = address
  13. }
  14. }
BeanStudents

3. 使用case clase + BeanProperty实现

  1. package scala_demo
  2. import scala.beans.BeanProperty
  1. case class CaseStudents (
    @BeanProperty var name:String="",
    @BeanProperty var age:String="",
    @BeanProperty var address:String=""
    )

查看编译后的class 文件信息: 

  1. Compiled from "CaseStudents.scala"
  2. public class scala_demo.CaseStudents implements scala.Product,scala.Serializable {
  3. private java.lang.String name;
  4. private java.lang.String age;
  5. private java.lang.String address;
  6. public static java.lang.String $lessinit$greater$default$3();
  7. public static java.lang.String $lessinit$greater$default$2();
  8. public static java.lang.String $lessinit$greater$default$1();
  9. public static scala.Option<scala.Tuple3<java.lang.String, java.lang.String, java.lang.String>> unapply(scala_demo.CaseStudents);
  10. public static java.lang.String apply$default$3();
  11. public static java.lang.String apply$default$2();
  12. public static java.lang.String apply$default$1();
  13. public static scala_demo.CaseStudents apply(java.lang.String, java.lang.String, java.lang.String);
  14. public static scala.Function1<scala.Tuple3<java.lang.String, java.lang.String, java.lang.String>, scala_demo.CaseStudents> tupled();
  15. public static scala.Function1<java.lang.String, scala.Function1<java.lang.String, scala.Function1<java.lang.String, scala_demo.CaseStudents>>> curried();
  16. public java.lang.String name();
  17. public void name_$eq(java.lang.String);
  18. public java.lang.String age();
  19. public void age_$eq(java.lang.String);
  20. public java.lang.String address();
  21. public void address_$eq(java.lang.String);
  22. public scala_demo.CaseStudents copy(java.lang.String, java.lang.String, java.lang.String);
  23. public java.lang.String copy$default$1();
  24. public java.lang.String copy$default$2();
  25. public java.lang.String copy$default$3();
  26. public java.lang.String getAddress();
  27. public java.lang.String getAge();
  28. public java.lang.String getName();
  29. public void setAddress(java.lang.String);
  30. public void setAge(java.lang.String);
  31. public void setName(java.lang.String);
  32. public java.lang.String productPrefix();
  33. public int productArity();
  34. public java.lang.Object productElement(int);
  35. public scala.collection.Iterator<java.lang.Object> productIterator();
  36. public boolean canEqual(java.lang.Object);
  37. public int hashCode();
  38. public java.lang.String toString();
  39. public boolean equals(java.lang.Object);
  40. public scala_demo.CaseStudents(java.lang.String, java.lang.String, java.lang.String);
  41. }
CaseStudents.class

 

序列化:

  1. package scala_demo
  2. import com.alibaba.fastjson.JSON
  3. import com.alibaba.fastjson.serializer.SerializerFeature
  4. object ToJson {
  5. def main(args: Array[String]): Unit = {
  6. println("--------- Class: Students ---------")
  7. // object -> json
  8. val students:Students = new Students("Zhao","10","BeiJing")
  9. val objStr = JSON.toJSONString(students, SerializerFeature.QuoteFieldNames)
  10. println(objStr)
  11. val js = JSON.parseObject(objStr,new Students().getClass)
  12. println(js)
  13. println("--------- Bean Class: Students ---------")
  14. val beanStudents = new BeanStudents("Sun","20","HangZhou")
  15. val objBeanStr = JSON.toJSONString(beanStudents,SerializerFeature.QuoteFieldNames)
  16. println(objBeanStr)
  17. val beanJs = JSON.parseObject(objBeanStr,new BeanStudents().getClass)
  18. println(beanJs)
  19. println(beanJs.name,beanJs.age,beanJs.address)
  20. println("--------- Case Class: Students ---------")
  21. val caseStudents = CaseStudents("Xian","10","ShangHai")
  22. val objCaseStr = JSON.toJSONString(caseStudents ,SerializerFeature.QuoteFieldNames)
  23. println(objCaseStr)
  24. val caseJs = JSON.parseObject(objCaseStr,CaseStudents().getClass)
  25. println(caseJs)
  26. }
  27. }

output:

  1. --------- Class: Students ---------
  2. {"address":"BeiJing","age":"10","name":"Zhao"}
  3. Students{name:'Zhao',age:'10',address:'BeiJing'}
  4. --------- Bean Class: Students ---------
  5. {"address":"HangZhou","age":"20","name":"Sun"}
  6. scala_demo.BeanStudents@66480dd7
  7. (Sun,20,HangZhou)
  8. --------- Case Class: Students ---------
  9. {"address":"ShangHai","age":"10","name":"Xian"}
  10. CaseStudents(Xian,10,ShangHai)

 

可以看到第3中方式可以极大程度的缩减代码量并在此基础上实现序列化

原文链接:http://www.cnblogs.com/feiquan/p/13737414.html

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号