Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/367.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/199.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用GSON在JSON序列化中包含某个临时字段_Java_Android_Json_Gson - Fatal编程技术网

Java 使用GSON在JSON序列化中包含某个临时字段

Java 使用GSON在JSON序列化中包含某个临时字段,java,android,json,gson,Java,Android,Json,Gson,我有这门课 Myclass { transient String field1; transient String field2; ... // other non transient fields } 我存储序列化对象,通过网络以这种方式使用它们(不包括临时字段) 然而,仅针对一种特殊情况,我需要在序列化中包含field2 有没有办法不排除使用gson进行序列化时的某个临时字段?解决方案0: 为类使用自定义类型适配器 考虑到 @JsonAdapter(KA.class) K类{

我有这门课

Myclass
{
  transient String field1;
  transient String field2;
  ... // other non transient fields
}
我存储序列化对象,通过网络以这种方式使用它们(不包括临时字段)

然而,仅针对一种特殊情况,我需要在序列化中包含field2


有没有办法不排除使用gson进行序列化时的某个临时字段?

解决方案0:

为类使用自定义类型适配器

考虑到

@JsonAdapter(KA.class)
K类{
私有临时字符串名;
私有临时字符串密码;
}
类实体适配器扩展了TypeAdapter{
@凌驾
public void write(JsonWriter out,Entity value)抛出IOException{
out.beginObject();
名称(“名称”);
out.value(value.getName());
out.名称(“密码”);
out.value(value.getPassword());
out.endObject();
}
@凌驾
公共实体读取(JsonReader in)引发IOException{
实体k=新实体();
in.beginObject();
in.nextName();
k、 setName(在.nextString()中);
in.nextName();
k、 setPassword(在.nextString()中);
in.endObject();
返回k;
}
}
完整示例

解决方案1:(不可靠)

添加另一个非
瞬态
字段,并始终为其复制
字段2
的任何新设定值。e、 g

瞬态字符串字段1;
瞬态串字段2;
@序列化名称(“字段2”)
私有字符串字段2_非_trans;
public void setField2(字符串arg_val){
this.field2=arg_val;
this.field2_non_trans=arg_val;
}
公共字符串getField2(){
如果(字段2==null){
field2=field2_非变速器;
} 
返回字段2;
}
全样本

但是必须跟踪对
字段2
的每次更改,以便始终更新
字段2\u non\u trans
的val副本,因此如果
字段2
是由构造函数设置的,或者是在其
setter
函数之外设置的,则必须确保为
字段2\u non\u trans
设置值copy

与反序列化相同,您必须:

  • 反序列化完成后,需要使用方法将
    field2\u non\u trans
    的反序列化值设置为
    field2
  • 或者只需通过
    getField2()
    方法返回
    field2\u non\u trans
    ,其中
    field2
    null
解决方案2:


标记
字段2
非瞬态。

您可以用另一个非瞬态字段复制瞬态字段,并从瞬态字段设置器写入值。想法是每次临时字段更新时都更新克隆字段。

尽管由于类似问题,我从不建议对不同的库使用相同的类,但您可以轻松管理Gson应用于被序列化和反序列化字段的方式

public final class TransientExclusionStrategy
实施排他性战略{
私有静态最终排除策略实例=新TransientExclusionStrategy();
私人过渡排斥战略(){
}
公共静态排除策略getInstance(){
返回实例;
}
@凌驾
公共布尔值shouldSkipField(最终字段属性){
@可空
最终Expose=attributes.getAnnotation(Expose.class);
if(expose==null){
返回attributes.hasModifier(Modifier.TRANSIENT);
}
return!expose.serialize();
}
@凌驾
公共布尔shouldSkipClass(最终类clazz){
返回false;
}
}
此实现将通过以下单元测试:

public final class TransientExclusionStrategyTest{
私有静态最终字符串EXPOSED=“EXPOSED”;
私有静态最终字符串忽略=“忽略”;
@抑制警告(“全部”)
私有静态最终类MyClass{
最终字符串s0=EXPOSED;//无显式expose,默认序列化
@Expose(serialize=false)
最后一个字符串s1=已忽略;//被注释忽略
@Expose(serialize=true)
最终字符串s2=EXPOSED;//由注释序列化
最终瞬态字符串ts0=已忽略;//无显式公开,默认情况下被忽略
@Expose(serialize=false)
最终瞬态字符串ts1=已忽略;//被注释忽略
@Expose(serialize=true)
最终瞬态字符串ts2=EXPOSED;//由注释序列化
}
@试验
公开无效测试(){
最终Gson Gson=新的GsonBuilder()
.AddSerializationExclutionStrategy(transientexExclusionStrategy.getInstance())
.create();
final JsonObject json=(JsonObject)gson.toJsonTree(new MyClass());
for(最终Map.Entry e:json.entrySet()){
最终字符串stringValue=e.getValue().getAsString();
assertEquals(EXPOSED,stringValue,()->“预期”+EXPOSED+,但“+e.getKey()”为“+stringValue+”);
}
}
}

因此,您不需要为每个这样的“特殊”类处理任何特殊类型适配器,也不需要引入中间字段(这不一定与您正在使用的其他库和框架处于冲突状态)。

解决方案1和2将为其他序列化生成一个“field2”字段,这在我的情况下是不合适的。但是输入适配器,sol。0,看起来很有希望,我会在有机会的时候调查的。谢谢。从技术上讲,编写自定义适配器可以解决这个问题,但是当类很大时,编写自定义适配器是一项乏味的工作,而且要以易于维护的方式编写它是一项挑战+是的,但它不会为其他序列化生成“field2”字段吗?在我的情况下,这对我来说是不好的。我想我需要smt像一个定制建设者为这个特殊的情况