在實際的開發中,咱們每每須要定義大量的類結構,來實現面向對象式的數據管理。考慮一種場景,這種場景下單個類管理的類成員變量有不少個,咱們如何實如今少許代碼編寫的狀況先實現一個類的序列化?java
1. 在Java 中要實現一個類的序列化,須要 implements Serializable ,這個類須要是 OPJO 。那麼在scala 中,咱們知道 BeanProperty 會幫咱們實現 get/set 方法,能夠極大的縮減代碼量json
2. 序列化咱們使用 alibaba 的fastjsonapp
<dependency> <groupId>com.alibaba</groupId> <artifactId>fastjson</artifactId> <version>1.2.47</version> <scope>compile</scope> </dependency>
package java_demo; import java.io.Serializable; public class Students implements Serializable { //姓名 private String name; //年齡 private String age; //住址 private String address; public Students() { } public Students(String name, String age, String address) { this.name = name; this.age = age; this.address = address; } @Override public String toString() { return "Students{" + "name='" + name + '\'' + ", age='" + age + '\'' + ", address='" + address + '\'' + '}'; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getAge() { return age; } public void setAge(String age) { this.age = age; } public String getAddress() { return address; } public void setAddress(String address) { this.address = address; } }
使用fastjson 序列化:less
package java_demo; import com.alibaba.fastjson.JSONObject; public class ToJson { public static void main(String[] args) { System.out.println("---------- Class Students --------"); // object -> json Students s = new Students("wang","10","beijing"); String objStr = JSONObject.toJSONString(s); System.out.println(objStr); // json -> object Students js = JSONObject.parseObject(objStr, Students.class); System.out.println(js); } }
output:ide
---------- Class Students -------- {"address":"beijing","age":"10","name":"wang"} Students{name='wang', age='10', address='beijing'}
1. 手動實現 get/set:函數
package scala_demo class Students { var name: String = _ var age: String = _ var address: String = _ def this(name: String, age: String, address: String) { this() // 調用主構造函數 this.name = name this.age = age this.address = address } def getName(): String = this.name def getAge(): String = this.age def getAddress(): String = this.address def setName(name: String) = this.name = name def setAge(age: String) = this.age = age def setAddress(address: String) = this.address = address override def toString: String = { this.getClass.getSimpleName + s"{name:'$name',age:'$age',address:'$address'}" } }
2. 使用BeanProperty實現this
package scala_demo import scala.beans.BeanProperty class BeanStudents { @BeanProperty var name: String = _ @BeanProperty var age: String = _ @BeanProperty var address: String = _ // 必須實現構造函數 def this(name: String, age: String, address: String) { this() this.name = name this.age = age this.address = address } }
3. 使用case clase + BeanProperty實現spa
package scala_demo import scala.beans.BeanProperty
case class CaseStudents (
@BeanProperty var name:String="",
@BeanProperty var age:String="",
@BeanProperty var address:String=""
)
查看編譯後的class 文件信息: scala
Compiled from "CaseStudents.scala" public class scala_demo.CaseStudents implements scala.Product,scala.Serializable { private java.lang.String name; private java.lang.String age; private java.lang.String address; public static java.lang.String $lessinit$greater$default$3(); public static java.lang.String $lessinit$greater$default$2(); public static java.lang.String $lessinit$greater$default$1(); public static scala.Option<scala.Tuple3<java.lang.String, java.lang.String, java.lang.String>> unapply(scala_demo.CaseStudents); public static java.lang.String apply$default$3(); public static java.lang.String apply$default$2(); public static java.lang.String apply$default$1(); public static scala_demo.CaseStudents apply(java.lang.String, java.lang.String, java.lang.String); public static scala.Function1<scala.Tuple3<java.lang.String, java.lang.String, java.lang.String>, scala_demo.CaseStudents> tupled(); public static scala.Function1<java.lang.String, scala.Function1<java.lang.String, scala.Function1<java.lang.String, scala_demo.CaseStudents>>> curried(); public java.lang.String name(); public void name_$eq(java.lang.String); public java.lang.String age(); public void age_$eq(java.lang.String); public java.lang.String address(); public void address_$eq(java.lang.String); public scala_demo.CaseStudents copy(java.lang.String, java.lang.String, java.lang.String); public java.lang.String copy$default$1(); public java.lang.String copy$default$2(); public java.lang.String copy$default$3(); public java.lang.String getAddress(); public java.lang.String getAge(); public java.lang.String getName(); public void setAddress(java.lang.String); public void setAge(java.lang.String); public void setName(java.lang.String); public java.lang.String productPrefix(); public int productArity(); public java.lang.Object productElement(int); public scala.collection.Iterator<java.lang.Object> productIterator(); public boolean canEqual(java.lang.Object); public int hashCode(); public java.lang.String toString(); public boolean equals(java.lang.Object); public scala_demo.CaseStudents(java.lang.String, java.lang.String, java.lang.String); }
序列化:code
package scala_demo import com.alibaba.fastjson.JSON import com.alibaba.fastjson.serializer.SerializerFeature object ToJson { def main(args: Array[String]): Unit = { println("--------- Class: Students ---------") // object -> json val students:Students = new Students("Zhao","10","BeiJing") val objStr = JSON.toJSONString(students, SerializerFeature.QuoteFieldNames) println(objStr) val js = JSON.parseObject(objStr,new Students().getClass) println(js) println("--------- Bean Class: Students ---------") val beanStudents = new BeanStudents("Sun","20","HangZhou") val objBeanStr = JSON.toJSONString(beanStudents,SerializerFeature.QuoteFieldNames) println(objBeanStr) val beanJs = JSON.parseObject(objBeanStr,new BeanStudents().getClass) println(beanJs) println(beanJs.name,beanJs.age,beanJs.address) println("--------- Case Class: Students ---------") val caseStudents = CaseStudents("Xian","10","ShangHai") val objCaseStr = JSON.toJSONString(caseStudents ,SerializerFeature.QuoteFieldNames) println(objCaseStr) val caseJs = JSON.parseObject(objCaseStr,CaseStudents().getClass) println(caseJs) } }
output:
--------- Class: Students --------- {"address":"BeiJing","age":"10","name":"Zhao"} Students{name:'Zhao',age:'10',address:'BeiJing'} --------- Bean Class: Students --------- {"address":"HangZhou","age":"20","name":"Sun"} scala_demo.BeanStudents@66480dd7 (Sun,20,HangZhou) --------- Case Class: Students --------- {"address":"ShangHai","age":"10","name":"Xian"} CaseStudents(Xian,10,ShangHai)
能夠看到第3中方式能夠極大程度的縮減代碼量並在此基礎上實現序列化