@gson serializednamee使用时需要配置什么东西吗

本文转自http://blog.csdn.net/jiayi_yao/article/details/,感谢原作者!
&n&:&kyoya&
&p&:&123456&
1 public class User{
然后就可以用fastjson或者Gson解析,至此都是正常步骤。
但有一个问题就是,User类的命名不太友好(id,n,p,s???),为此,Gson提供了一个麻烦的方法来解决这个不友好(嗯,麻烦!毕竟本小白有密集恐惧症),即提供@SerializedName注解
1 public class User{
@SerializedName(&n&)
private String userN
@SerializedName(&p&)
@SerializedName(&s&)
再使用Gson解析的时候就会自动将n对应的值赋值到userName属性上,同样,如果要将User生成json字符串,使用Gson生成的时候也会将userName的名字生成n。
这样就解决了java对象里属性名跟json里字段名不匹配的情况了。
再使用Gson解析的时候就会将n对应的值赋值到userName属性上,同样的如果我们要将User生成json字符串使用Gson生成的时候也会将userName的名字生成n。这样就解决了java对象里属性名跟json里字段名不匹配的情况了。
本文已收录于以下专栏:
相关文章推荐
1.使用@Expose可以区分实体中不想被序列化的属性
@Expose标签的2个属性. 
  1.1 deserialize (boolean)
反序列化 默认 true
    1...
转载自/archives/125.html
今天在使用Gson解析json时,碰到这个@SerializedName,查了下资料,觉得这篇说的很好!
...
在讲如何解析数据之前,先描述一下gson中的两个注解@Expose和@SerializedName。
@Expose注解的作用:区分实体中不想被序列化的属性,其自身包含两个属性deserialize...
刚才在看一个安卓demo的时候突然看到一段代码然后瞬间蒙逼了。
@SerializedName
到底是什么鬼呢?然后百度了一下,终于搞明白了,这里记录一下,免得以后就忘记了。
gson的@Expose注解和@SerializedName注解
是一种简写形式,完全可以手动配置替代这种简写形式,简写形式可以让初学都快速应用默认配置方案。 会自动注册DefaultAnnotationHandlerMapping与AnnotationMethod...
最近学习了一个注解框架ButterKnife。地址:http://jakewharton.github.io/butterknife/,/JakeWharton/b...
他的最新文章
讲师:王哲涵
讲师:王渊命
您举报文章:
举报原因:
原文地址:
原因补充:
(最多只允许输入30个字)拒绝访问 |
| 百度云加速
请打开cookies.
此网站 () 的管理员禁止了您的访问。原因是您的访问包含了非浏览器特征(3a674cfdf2344394-ua98).
重新安装浏览器,或使用别的浏览器@serializedname注解的意思
在Android中解析Gson解析json数据是很方便快捷的,可以直接将json数据解析成java对象或者集合。
使用Gson解析json成对象时默认的是将json里对应字段的值解析到java对象里对应字段的属性里面。然后我们经常会遇到我们自己定义的java对象里的属性名跟json里的字段名是不一样的,这种情况怎么办呢,这时我们就可以使用@SerializedName注解来将对象里的属性跟json里字段对应值匹配起来。
下面说说具体使用方法:
  我们有一段json数据如下:
&&&&&&&&&& {
&&& &id&:&1&
&&& &n&:&kyoya&
&&& &p&:&123456&
&&& &s&:&0&
定义一个User类解析json
public class User{
& & & && private S
&& & & & private S
& & & && private S
& & & && private S
User类要这样写才能直接使用Gson直接解析出来,但是这样的话User类的属性命名就不太友好了,那我们要怎么做呢?Gson提供注解的方法来解决这个问题@SerializedName,使用方法如下:
public class User{
&&& private S
&&& @SerializedName(&n&)
&&& private String userN
&&& @SerializedName(&p&)
&&& private S
&&& @SerializedName(&s&)
&&& private S
优化后的User写法
这样再使用Gson解析的时候就会将n对应的值赋值到userName属性上,同样的如果我们要将User生成json字符串使用Gson生成的时候也会将userName的名字生成n。这样就解决了java对象里属性名跟json里字段名不匹配的情况了。
&&相关文章推荐
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:29536次
排名:千里之外
原创:50篇
(2)(1)(6)(12)(2)(1)(1)(1)(2)(4)(1)(6)(4)(4)(3)
(window.slotbydup = window.slotbydup || []).push({
id: '4740887',
container: s,
size: '250,250',
display: 'inlay-fix'Android Model正确使用姿势——AutoValue - 知乎专栏
{"debug":false,"apiRoot":"","paySDK":"/api/js","wechatConfigAPI":"/api/wechat/jssdkconfig","name":"production","instance":"column","tokens":{"X-XSRF-TOKEN":null,"X-UDID":null,"Authorization":"oauth c3cef7c66aa9e6a1e3160e20"}}
{"database":{"Post":{"":{"contributes":[],"title":"Android Model正确使用姿势——AutoValue","author":"LiushuiXiaoxia","content":"最近看到几篇博客是关于AutoValue的,然后自己十分喜欢,一下子觉的这样写代码很优雅,所以决定自己也写一篇文章介绍下AutoValue。本文最先发表于,如有转载,请注明转载出处。前言首先说Android Model,在开发中网络请求,以及数据库操作等,我们都会定义一个Model,不同人对这个的说法不一样,比如有Entry,Bean,Pojo。然后开发的过程中会遇到下面问题:构成方法:自定义构造方法,如果实体比较复杂,可能会用到工厂模式或者是建造者模式序列化:比如实现Serializable接口,Parcelable接口。Json解析:有时候直接使用的是json数据,比如@SerializedName注解。自定义方法:对Model的字段有setter,getter方法,toString的实现,在处理hash的时候,需要实现equals和hashcode方法。以上这么问题,其实在Eclipse和Android Studio中都是有快捷功能帮我们自动生成,后面的代码示例,就是我用Android Studio自动生成的。比如下面一个User类是我们的本次示例的一个Model,如果按照正常的写法,是这样的。public abstract class User implements Serializable {\n\n
@SerializedName(\"id\")\\n\n
@SerializedName(\"name\")\n
private S\n\n
public int getId() {\\n
public void setId(int id) {\n
this.id =\n
public String getName() {\\n
public void setName(String name) {\n
this.name =\n
@Override\n
public boolean equals(Object o) {\n
if (this == o)\n
if (o == null || getClass() != o.getClass())\n\n
User user = (User)\n\n
if (id != user.id)\n
return name != null ? name.equals(user.name) : user.name ==\n\n
@Override\n
public int hashCode() {\n
int result =\n
result = 31 * result + (name != null ? name.hashCode() : 0);\n \n
@Override\n
public String toString() {\n
return \"User{\" +\n
\"id=\" + id +\n
\", name='\" + name + '\\'' +\n
}\n}\n简介官方文档给出的解释是这样的,大致意思是说是一个生成Java不可变的值类型工具,仔细研读源代码后,使用的技术是Java Apt,这个后面再做详细解释。AutoValue - Immutable value-type code generation for Java 1.6+.简单使用按照上面的例子,如果是AutoValue,代码是这样的。首先需要在Android项目里面引入apt功能,在项目根目录的gradle中添加,buildscript {\n
repositories {\n
jcenter()\n
dependencies {\n
classpath 'com.android.tools.build:gradle:2.2.2'\n
// 引入apt插件\n
classpath 'com.neenbedankt.gradle.plugins:android-apt:1.8'\n
}\n}\n其次在module(一般是app目录)中gradle使用apt插件。apply plugin: 'com.android.application'\napply plugin: 'com.neenbedankt.android-apt'\n最后加入AutoValue依赖。dependencies {\n
provided 'com.google.auto.value:auto-value:1.3'\n
apt 'com.google.auto.value:auto-value:1.3'\n}\n修改User类,如下所示,User已经变成了一个抽象类,类似于使用Retrofit一样,申明已经变成了一个接口,然后实现类是由AutoValue生成的代码。import com.google.auto.value.AutoV\n\n@AutoValue\npublic abstract class User {\n\n
public abstract int id();\n\n
public abstract String name();\n\n
public static User newInstance(int id, String name) {\n
return new AutoValue_User(id, name);\n
}\n}\n我们可以看看AutoValue到底干了什么?AutoValue会自动生成一个AutoValue_User,这个类是继承了上面申明的User类,这个是默认default的访问权限,那么在其他package中是无法访问的,这样在其他代码里面也不会看到这么奇怪的名字。同时所有的字段都是final类型,如果字段是对象类型的,那么还不能为空,这个问题先保留,后面再做详解。因为申明的是final类型,那么所有的字段都是没有setter方法的。代码里同时也实现了equals、hashcode、toString方法。 final class AutoValue_User extends User {\n\n
private final S\n\n
AutoValue_User(\n
String name) {\n
this.id =\n
if (name == null) {\n
throw new NullPointerException(\"Null name\");\n
this.name =\n
@Override\n
public int id() {\\n
@Override\n
public String name() {\\n
@Override\n
public String toString() {\n
return \"User{\"\n
+ \"id=\" + id + \", \"\n
+ \"name=\" + name\n
+ \"}\";\n
@Override\n
public boolean equals(Object o) {\n
if (o == this) {\\n
if (o instanceof User) {\n
User that = (User)\n
return (this.id == that.id())\n
&& (this.name.equals(that.name()));\n
@Override\n
public int hashCode() {\n
int h = 1;\n
h *= 1000003;\n
h ^= this.\n
h *= 1000003;\n
h ^= this.name.hashCode();\\n
}\n}\nImmutable/Value types刚刚上面说到,所有的字段都是final类型,那么而且实现类也是final的,有个专业术语叫Immutable。Immutable/Value types 这个概念对有些朋友来说可能还比较陌生,简单来说就是一个数据对象一旦构造完成,就再也无法修改了。这样有什么好处呢?最大的好处就是多线程访问可以省去很多同步控制,因为它们是不可变的,一旦构造完成,就不会存在多线程竞争访问问题了。多线程最麻烦的处理就是控制好读写问题,如果大家都是读,那么就不存控制了,所以省去了很多同步操作。更多关于Immutable 的介绍,可以参阅
。举个Java中的例子:String和StringBuilder,String是immutable的,每次对于String对象的修改都将产生一个新的String对象,而原来的对象保持不变,而StringBuilder是mutable,因为每次对于它的对象的修改都作用于该对象本身,并没有产生新的对象。Immutable objects 比传统的mutable对象在多线程应用中更具有优势,它不仅能够保证对象的状态不被改变,而且还可以不使用锁机制就能被其他线程共享。总结下Immutable对象的优缺点:优点Immutable对象是线程安全的,可以不用被synchronize就在并发环境中共享Immutable对象简化了程序开发,因为它无需使用额外的锁机制就可以在线程间共享Immutable对象提高了程序的性能,因为它减少了synchroinzed的使用Immutable对象是可以被重复使用的,你可以将它们缓存起来重复使用,就像字符串字面量和整型数字一样。你可以使用静态工厂方法来提供类似于valueOf()这样的方法,它可以从缓存中返回一个已经存在的Immutable对象,而不是重新创建一个。缺点Immutable也有一个缺点就是会制造大量垃圾,由于他们不能被重用而且对于它们的使用就是”用“然后”扔“,字符串就是一个典型的例子,它会创造很多的垃圾,给垃圾收集带来很大的麻烦。当然这只是个极端的例子,合理的使用immutable对象会创造很大的价值。高级使用Nullable上面说过如果类中有对象类型的成员变量,那么是为非空的,但是在实际情况下,有的字段的是值就是为null,所以在申明时候可申明为Nullable就可以了。import android.support.annotation.N\n\nimport com.google.auto.value.AutoV\nimport com.google.gson.annotations.SerializedN\n\n@AutoValue\npublic abstract class NullableUser {\n\n
@SerializedName(\"id\")\n
public abstract int id();\n\n
@Nullable\n
@SerializedName(\"name\")\n
public abstract String name();\n\n
public static NullableUser newInstance(int id, String name) {\n
return new AutoValue_NullableUser(id, name);\n
}\n}\n生成代码:final class AutoValue_NullableUser extends NullableUser {\n\n
private final S\n\n
AutoValue_NullableUser(\n
@Nullable String name) {\n
this.id =\n
this.name =\n
}\n}\n测试用例
@Test(expected = NullPointerException.class)\n
public void testUserNullPointException() throws Exception {\n
User.newInstance(100, null);\n
public void testUserNullable() {\n
NullableUser user = NullableUser.newInstance(100, \"test\");\n\n
System.out.println(\"user = \" + user);\n
Assert.assertEquals(user.id(), 100);\n
Assert.assertEquals(user.name(), \"test\");\n
}\nGson序列化Gson 使用比较麻烦,在普通的Model中,只需要在字段上面添加 @SerializedName注解即可。但是使用AutoValue,稍微有点繁琐。首先需要引入一个依赖包,这里是。
provided 'com.ryanharter.auto.value:auto-value-gson:0.4.4'\n
apt 'com.ryanharter.auto.value:auto-value-gson:0.4.4'\n其次申明的抽象类中,每个方法上面添加对应的注解,然后再添加一个typeAdapter方法,申明这个方法,Gson就会根据这个找到对应的adapter,如下所示。@AutoValue\npublic abstract class User {\n\n
@SerializedName(\"id\")\n
public abstract int id();\n\n
@SerializedName(\"name\")\n
public abstract String name();\n\n
public static User newInstance(int id, String name) {\n
return new AutoValue_User(id, name);\n
public static TypeAdapter&User& typeAdapter(Gson gson) {\n
return new AutoValue_User.GsonTypeAdapter(gson);\n
}\n}\ntypeAdapter方法模板如下,T就是你当前Model的名字,写完以后会出现错误,没事重新编译下就好了,这样就会重新生成了代码。public static TypeAdapter&T& typeAdapter(Gson gson) {\n
return new AutoValue_T.GsonTypeAdapter(gson);\n}\n第三申明一个TypeAdapterFactory的一个实现类,这个类是abstract的,AutoValue也会自动生成其实现类。@GsonTypeAdapterFactory\npublic abstract class MyAdapterFactory implements TypeAdapterFactory {\n\n
public static TypeAdapterFactory create() {\n
return new AutoValueGson_MyAdapterFactory();\n
}\n}\n最后是单元测试,在json字符串转Model的时候,会使用一个Gson对象,这个对象不是平常使用的对象,需要自定义配置一些东西,然后这里就用到了上面所申明的MyAdapterFactory。
public void testUserToJson() {\n
User user = User.newInstance(100, \"test\");\n\n
String json = new Gson().toJson(user);\n
System.out.println(json);\n\n
Assert.assertEquals(\"{\\\"id\\\":100,\\\"name\\\":\\\"test\\\"}\", json);\n
public void testUserParseFromJson() {\n
String json = \"{\\\"id\\\":100,\\\"name\\\":\\\"test\\\"}\";\n\n
// 自定义的Gson对象,需要配置 MyAdapterFactory\n
Gson gson = new GsonBuilder().registerTypeAdapterFactory(MyAdapterFactory.create()).create();\n\n
User user = gson.fromJson(json, User.class);\n
System.out.println(user);\n
Assert.assertNotNull(user);\n
Assert.assertEquals(user.name(), \"test\");\n
Assert.assertEquals(user.id(), 100);\n\n
NullableUser nullableUser = gson.fromJson(json, NullableUser.class);\n
System.out.println(nullableUser);\n
Assert.assertNotNull(nullableUser);\n
Assert.assertEquals(nullableUser.name(), \"test\");\n
Assert.assertEquals(nullableUser.id(), 100);\n
}\nSerializable & ParcelableSerializable是Java自带的序列化方式,和AutoValue结合不影响原先使用,只需要在申明的Model中实现Serializable接口即可。Parcelable是Android提供的序列化方式,如果需要和AutoValue结合使用,和Serializable基本差不多,实现相关接口,然后在Gradle文件引入相关apt依赖即可。
apt 'com.ryanharter.auto.value:auto-value-parcel:0.2.5'\n
// Optionally for TypeAdapter support\n
// compile 'com.ryanharter.auto.value:auto-value-parcel-adapter:0.2.5'\n上面的auto-value-parcel-adapter是可选项,是auto-value-parcel提供自定义类型转化,相关使用可以参见Github地址。检查下Autovalue自动给我们实现的代码,果然不出所料,全部自动生成了。final class AutoValue_User extends $AutoValue_User {\n
public static final Parcelable.Creator&AutoValue_User& CREATOR = new Parcelable.Creator&AutoValue_User&() {\n
@Override\n
public AutoValue_User createFromParcel(Parcel in) {\n
return new AutoValue_User(\n
in.readInt(),\n
in.readString()\n
@Override\n
public AutoValue_User[] newArray(int size) {\n
return new AutoValue_User[size];\n
AutoValue_User(int id, String name) {\n
super(id, name);\n
@Override\n
public void writeToParcel(Parcel dest, int flags) {\n
dest.writeInt(id());\n
dest.writeString(name());\n
@Override\n
public int describeContents() {\n
return 0;\n
}\n}\nRetrofit和Rxjava结合使用Android 开发的时候,很多开发者使用Retrofit这个网络库,以及RxJava异步工具。下面举例如何结合使用AutoValue,Retrofit,Rxjava。这里有个获取天气的接口,返回的结果是json,我们用这个来测试下Retrofit。// /v3/weather/now.json?key=x4qjfuniyu97mt9y&location=beijing&language=zh-Hans&unit=c\n{\n
\"results\": [\n
\"location\": {\n
\"id\": \"WX4FBXXFKE4F\",\n
\"name\": \"北京\",\n
\"country\": \"CN\",\n
\"path\": \"北京,北京,中国\",\n
\"timezone\": \"Asia/Shanghai\",\n
\"timezone_offset\": \"+08:00\"\n
\"now\": {\n
\"text\": \"霾\",\n
\"code\": \"31\",\n
\"temperature\": \"10\"\n
\"last_update\": \"T14:45:00+08:00\"\n
]\n}\n申明Retrofit Api接口,一个普通的调用,一个是RxJava的方式。public interface IWeatherApi {\n\n
@GET(\"/v3/weather/now.json?key=x4qjfuniyu97mt9y&location=beijing&language=zh-Hans&unit=c\")\n
Call&Weather& getWeather();\n\n
@GET(\"/v3/weather/now.json?key=x4qjfuniyu97mt9y&location=beijing&language=zh-Hans&unit=c\")\n
Observable&Weather& getWeatherWithRx();\n}\nRetrofit 接口创建public class RetrofitUtil {\n
public static &T& T createApi(@NonNull Class&T& tClass, Gson gson) {\n
return new Retrofit.Builder()\n
.baseUrl(\"\")\n
.client(new OkHttpClient.Builder().build())\n
.addConverterFactory(GsonConverterFactory.create(gson))\n
.addCallAdapterFactory(RxJavaCallAdapterFactory.create())\n
.build()\n
.create(tClass);\n
}\n}\nWeather Model申明public abstract class Weather {\n\n
@SerializedName(\"results\")\n
public abstract List&ResultsItem& results();\n\n
public static TypeAdapter&Weather& typeAdapter(Gson gson) {\n
return new AutoValue_Weather.GsonTypeAdapter(gson);\n
}\n}\n测试用例,注意:Retrofit使用Gson和前面使用Gson使用方式一样,需要自己自定义,不然无法解决json解析问题。
public void testRetrofitWithAutoValue() {\n
Gson gson = new GsonBuilder().registerTypeAdapterFactory(MyAdapterFactory.create()).create();\n
IWeatherApi weatherApi = RetrofitUtil.createApi(IWeatherApi.class, gson);\n
// 同步调用\n
Weather weather = weatherApi.getWeather().execute().body();\n
Assert.assertNotNull(weather);\n\n
System.out.println(weather);\n\n
// Rxjava 使用\n
weatherApi.getWeatherWithRx().subscribe(new Action1&Weather&() {\n
@Override\n
public void call(Weather weather) {\n
System.out.println(weather);\n
} catch (IOException e) {\n
e.printStackTrace();\n
}\n运行结果,正常的返回天气信息。Weather{results=[ResultsItem{now=Now{code=31, temperature=9, text=霾}, lastUpdate=T14:15:00+08:00, location=Location{country=CN, path=北京,北京,中国, timezone=Asia/Shanghai, timezoneOffset=+08:00, name=北京, id=WX4FBXXFKE4F}}]}\nWeather{results=[ResultsItem{now=Now{code=31, temperature=9, text=霾}, lastUpdate=T14:15:00+08:00, location=Location{country=CN, path=北京,北京,中国, timezone=Asia/Shanghai, timezoneOffset=+08:00, name=北京, id=WX4FBXXFKE4F}}]}\n相关插件RoboPOJOGeneratorGsonFormat是一款Android Studio的插件,它可以把json字符串,转变成Model对象,很多人都喜欢用它。但是如果使用了AutoValue,那么原先的插件就不能使用了,没有关系,本来打算自己高仿GsonFormat重新写了一个插件,以实现我们的需求,后面又发现有一款插件可以实现——RoboPOJOGenerator。RoboPOJOGenerator使用, AutoValue plugin上面我们发现有了json字符串,有时候还要写factory和buildder方法,那么问题来了,没有插件能帮我们实现这个步骤,然代码更加的优雅,开发更加高效?答案是肯定的,Autovalue plugin就是干这个事的。我们用刚刚上面的Weather做演示,相关演示:原理介绍本文重点介绍的AutoValue只是
中的一小部分,Auto中还有其他好玩的。AutoFactoryAutoFactory和AutoValue类似,可以自动帮助代码生成工厂类,兼容Java 依赖注入标准(JSR-330)。代码示例@AutoFactory\npublic class FactoryUser {\n\n
private final S\n\n
public FactoryUser(int id, String name) {\n
this.id =\n
this.name =\n
public int getId() {\\n
public String getName() {\\n
@Override\n
public String toString() {\n
return \"FactoryUser{\" +\n
\"id=\" + id +\n
\", name='\" + name + '\\'' +\n
}\n}\n生成后的代码public final class FactoryUserFactory {\n
public FactoryUserFactory() {\n
public FactoryUser create(int id, String name) {\n
return new FactoryUser(id, name);\n
}\n}\n测试代码
public void testFactoryUser() {\n
FactoryUser user = new FactoryUserFactory().create(100, \"test\");\n\n
System.out.println(user);\n
Assert.assertNotNull(user);\n
Assert.assertEquals(100, user.getId());\n
Assert.assertEquals(\"test\", user.getName());\n
}\nAutoServiceAutoService比较简单,就是在使用Java APT的时候,使用AutoService注解,可以自动生成meta信息。AutoCommon这个是Google对Java Apt的一个扩展,一般的在自己写Apt的时候,都需要继承AbstractProcessor,但是google对它进行了扩展,BasicAnnotationProcessor,如果你想自己写个工具,那么就可以使用这个了。给大家举个栗子,Dagger当初是Square公司受到Guice的启发,然后自己开发出一套依赖注入框架,当时Dagger使用的是Java反射,大家知道Java反射的效率其实并不高。再后来都到了AutoValue的启发,在Dagger的分支上切个新分支,开发出Dagger2,然后这个Dagger2是由Google维护的,我们可以在Dagger2的Github上面找到证据。Auto相关使用IntentBuilder有时候几个Activity之间相互跳转的时候需要传递一些参数,这些参数可以是基本类型,也有可能是复杂的类型,如果是负责的类型,必须要实现Serializable 或 Parcelable接口,上面也有介绍。下面推IntentBuilder,IntentBuilder也是利用代码生成的方法实现的。Activity传参@IntentBuilder\nclass DetailActivity extends Activity {\n\n
@Extra @Nullable\n
@Override\n
public void onCreate(Bundle savedInstanceState) {\n
super.onCreate(savedInstanceState);\n
DetailActivityIntentBuilder.inject(getIntent(), this);\n
// TODO use id and title\n
}\n}\n\n// 调用方式\nstartActivity(\n
new DetailActivityIntentBuilder(\"12345\")\n
.title(\"MyTitle\")\n
.build(context)\n)\nService传参@IntentBuilder\nclass DownloadService extends IntentService {\n\n
String downloadU\n\n
@Override\n
protected void onHandleIntent(Intent intent) {\n
MyServiceIntentBuilder.inject(intent, this);\n
}\n\n}\n\nstartService(new DownloadServiceIntentBuilder(\"\").build(context))\nFragmentArgs上面介绍了Activity、Service的传参,但Fragment的传参方式是不一样的,还有需要提醒一句一般通过setter方法给Fragment传参是不是正确的方式,必须通过setArgs的方式。相关代码示例:@FragmentWithArgs\npublic class MyFragment extends Fragment {\n
@Override\n
public void onCreate(Bundle savedInstanceState) {\n
super.onCreate(savedInstanceState);\n
FragmentArgs.inject(this); \n
// inject 之后,就可以使用 id 了\n
}\n}\n\nMyFragment fragment = MyFragmentBuilder.newMyFragment(101);\n其他相关Kotlin Data ClassKotlin 是一个基于 JVM 的新的编程语言,由 JetBrains 开发。有机会可以向大家介绍这种语言。Kotlin 中提供一种类似于AutoValue中的功能,Data Class表示这个类似是一个数据类型。比如下面是kotlin中对Model的写法,就是这么的简单、明了、优雅。data class KotlinUser(val id: Int,\n
val name: String)\nKotlin与Java是可以相互调用的。下面是Java的测试用例。public class UserTest {\n\n
public void testUser() {\n
KotlinUser user = new KotlinUser(100, \"test\");\n\n
System.out.println(user);\n\n
Assert.assertEquals(100, user.getId());\n
Assert.assertEquals(\"test\", user.getName());\n
}\n}\n我们可以反编译Kotlin生成的class字节码,看看这个中间到底发生了什么,很明显Kotlin做了很多的语法糖,这里编译器生成的代码和上面Autovalue生成的代码很像。Object-CObject-C中可以过直接申明@property方式,然后就可以自动实现setter和getter方法,如果要实现Immutable type方式,需要注明readonly。hash、equals、description如果使用APPCode,代码是可以自动生成的。@interface OcUser : NSObject\n\n@property(readonly)\n\n@property(retain, readonly) NSString *\n\n- (instancetype)initWithId:(int)id name:(NSString *)\n\n- (NSString *)\n\n- (BOOL)isEqual:(id)\n\n- (BOOL)isEqualToUser:(OcUser *)\n\n- (NSUInteger)\n\n@end\n\n// ==========================\n\n#import \"OcUser.h\"\n@implementation OcUser {\n\n}\n- (instancetype)initWithId:(int)id name:(NSString *)name {\n
self = [super init];\n
if (self) {\n
}\n\\n}\n\n- (BOOL)isEqual:(id)other {\n
if (other == self)\n
return YES;\n
if (!other || ![[other class] isEqual:[self class]])\n
return NO;\n\n
return [self isEqualToUser:other];\n}\n\n- (BOOL)isEqualToUser:(OcUser *)user {\n
if (self == user)\n
return YES;\n
if (user == nil)\n
return NO;\n
if (self.id != user.id)\n
return NO;\n
return !(self.name != user.name && ![self.name isEqualToString:user.name]);\n}\n\n- (NSUInteger)hash {\n
NSUInteger hash = (NSUInteger) self.\n
hash = hash * 31u + [self.name hash];\\n}\n\n- (NSString *)description {\n
NSMutableString *description = [NSMutableString stringWithFormat:@\"&%@: \", NSStringFromClass([self class])];\n
[description appendFormat:@\"self.id=%i\", self.id];\n
[description appendFormat:@\", self.name=%@\", self.name];\n
[description appendString:@\"&\"];\n
\n}\n@end\n测试用例#import &Foundation/Foundation.h&\n#import \"OcUser.h\"\n\nint main(int argc, const char *argv[]) {\n
@autoreleasepool {\n
OcUser *user = [[OcUser alloc] initWithId:100 name:@\"test\"];\n\n
NSLog(@\"user = %@\", user);\n
return 0;\n}\n\n// 运行结果\n// user = &OcUser: self.id=100, self.name=test&\n总结本文主要介绍了Autovalue的主要用法,以及AutoValu周边只是,可能说的比较多,比较杂,而且有的地方也不够深入,但是个人觉的这是一种思路,一种解决方案,后面如果自己需要造轮子的时候,我们是可以借鉴的。本示例代码地址 参考连接","updated":"T14:06:22.000Z","canComment":false,"commentPermission":"anyone","commentCount":2,"collapsedCount":0,"likeCount":12,"state":"published","isLiked":false,"slug":"","isTitleImageFullScreen":false,"rating":"none","titleImage":"","links":{"comments":"/api/posts//comments"},"reviewers":[],"topics":[{"url":"/topic/","id":"","name":"Android 开发"}],"adminClosedComment":false,"titleImageSize":{"width":0,"height":0},"href":"/api/posts/","excerptTitle":"","tipjarState":"closed","annotationAction":[],"sourceUrl":"","pageCommentsCount":2,"hasPublishingDraft":false,"snapshotUrl":"","publishedTime":"T22:06:22+08:00","url":"/p/","lastestLikers":[{"bio":"","isFollowing":false,"hash":"940487cadbe38d89dafc3e2cee8239bb","uid":80,"isOrg":false,"slug":"fei007","isFollowed":false,"description":"","name":"瞅啥","profileUrl":"/people/fei007","avatar":{"id":"746a5cfa0ea4","template":"/{id}_{size}.jpg"},"isOrgWhiteList":false},{"bio":"","isFollowing":false,"hash":"33f41fecaa1caac7dab421e3","uid":16,"isOrg":false,"slug":"you-pao-pao","isFollowed":false,"description":"心之所向,素履以往;生如逆旅,一苇以航。","name":"游泡泡","profileUrl":"/people/you-pao-pao","avatar":{"id":"be63998c0","template":"/{id}_{size}.jpg"},"isOrgWhiteList":false},{"bio":"Android & Python
...","isFollowing":false,"hash":"46c7083c7db361cb8ceaa","uid":80,"isOrg":false,"slug":"zeroZh","isFollowed":false,"description":"http://brucezz.github.io/","name":"Brucezz","profileUrl":"/people/zeroZh","avatar":{"id":"309df095c9d1b1e666368","template":"/{id}_{size}.png"},"isOrgWhiteList":false},{"bio":"","isFollowing":false,"hash":"92f5e9437eceda72a71ab19021facb91","uid":48,"isOrg":false,"slug":"wu-chang-feng-14","isFollowed":false,"description":"","name":"allen","profileUrl":"/people/wu-chang-feng-14","avatar":{"id":"v2-8c210b61c6e8ce47fde2","template":"/{id}_{size}.jpg"},"isOrgWhiteList":false},{"bio":"不羁放纵爱撸码","isFollowing":false,"hash":"f316f5a924c6ead979dfd7","uid":527700,"isOrg":false,"slug":"xu-zhi-75-83","isFollowed":false,"description":"热爱编程热爱生活。个人博客xzane.cc","name":"徐志","profileUrl":"/people/xu-zhi-75-83","avatar":{"id":"46d0f8e337ee4c7e4bcedbfa","template":"/{id}_{size}.jpg"},"isOrgWhiteList":false}],"summary":"最近看到几篇博客是关于AutoValue的,然后自己十分喜欢,一下子觉的这样写代码很优雅,所以决定自己也写一篇文章介绍下AutoValue。本文最先发表于,如有转载,请注明转载出处。前言首先说Android Model,在开发中网络请求,以及数据库操作等,我们都…","reviewingCommentsCount":0,"meta":{"previous":null,"next":null},"annotationDetail":null,"commentsCount":2,"likesCount":12,"FULLINFO":true}},"User":{"LiushuiXiaoxia":{"isFollowed":false,"name":"流水不腐小夏","headline":"","avatarUrl":"/852b2e58bbcc192c9aa3_s.jpg","isFollowing":false,"type":"people","slug":"LiushuiXiaoxia","bio":"流水不腐","hash":"dd0ec554d7b7d9ad17b5451","uid":12,"isOrg":false,"description":"","profileUrl":"/people/LiushuiXiaoxia","avatar":{"id":"852b2e58bbcc192c9aa3","template":"/{id}_{size}.jpg"},"isOrgWhiteList":false,"badge":{"identity":null,"bestAnswerer":null}}},"Comment":{},"favlists":{}},"me":{},"global":{"experimentFeatures":{"ge3":"ge3_9","ge2":"ge2_1","nwebStickySidebar":"sticky","nwebAnswerRecommendLive":"newVersion","newMore":"new","sendZaMonitor":"true","liveReviewBuyBar":"live_review_buy_bar_2","liveStore":"ls_a2_b2_c1_f2","homeUi2":"default","answerRelatedReadings":"qa_recommend_by_algo_related_with_article","qrcodeLogin":"qrcode","newBuyBar":"liveoldbuy","newMobileColumnAppheader":"new_header","zcmLighting":"zcm","favAct":"default","appStoreRateDialog":"close","mobileQaPageProxyHeifetz":"m_qa_page_nweb","iOSNewestVersion":"4.2.0","default":"None","wechatShareModal":"wechat_share_modal_show","qaStickySidebar":"sticky_sidebar","androidProfilePanel":"panel_b"}},"columns":{"next":{}},"columnPosts":{},"columnSettings":{"colomnAuthor":[],"uploadAvatarDetails":"","contributeRequests":[],"contributeRequestsTotalCount":0,"inviteAuthor":""},"postComments":{},"postReviewComments":{"comments":[],"newComments":[],"hasMore":true},"favlistsByUser":{},"favlistRelations":{},"promotions":{},"switches":{"couldAddVideo":false},"draft":{"titleImage":"","titleImageSize":{},"isTitleImageFullScreen":false,"canTitleImageFullScreen":false,"title":"","titleImageUploading":false,"error":"","content":"","draftLoading":false,"globalLoading":false,"pendingVideo":{"resource":null,"error":null}},"drafts":{"draftsList":[],"next":{}},"config":{"userNotBindPhoneTipString":{}},"recommendPosts":{"articleRecommendations":[],"columnRecommendations":[]},"env":{"edition":{},"isAppView":false,"appViewConfig":{"content_padding_top":128,"content_padding_bottom":56,"content_padding_left":16,"content_padding_right":16,"title_font_size":22,"body_font_size":16,"is_dark_theme":false,"can_auto_load_image":true,"app_info":"OS=iOS"},"isApp":false},"sys":{},"message":{"newCount":0},"pushNotification":{"newCount":0}}

我要回帖

更多关于 serializedname注解 的文章

 

随机推荐