Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/13.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 如何实现JsonSerializer';在一般情况下是序列化的吗?_Java_Json_Serialization_Gson_Jsonserializer - Fatal编程技术网

Java 如何实现JsonSerializer';在一般情况下是序列化的吗?

Java 如何实现JsonSerializer';在一般情况下是序列化的吗?,java,json,serialization,gson,jsonserializer,Java,Json,Serialization,Gson,Jsonserializer,在手册中,仅包含基本大小写 如果我的案例不是原始的呢 假设我有一个类,它有一个默认序列化问题(在我的例子中是无止境递归) 类包含多个字段,其中一些字段是“主”字段,保存信息,而另一些字段是服务字段 所以我只需要序列化“main”字段,并从中派生服务字段 class MyType1 { MyType2 a; // "main" field MyType3 b; // service fiels } class MySerializer implements JsonSerialize

在手册中,仅包含基本大小写

如果我的案例不是原始的呢

假设我有一个类,它有一个默认序列化问题(在我的例子中是无止境递归)

类包含多个字段,其中一些字段是“主”字段,保存信息,而另一些字段是服务字段

所以我只需要序列化“main”字段,并从中派生服务字段

class MyType1 {
   MyType2 a; // "main" field
   MyType3 b; // service fiels
}

class MySerializer implements JsonSerializer<MyType1> {
    @Override
    public JsonElement serialize(MyType1 arg0, Type arg1, JsonSerializationContext arg2) {
        JsonObject ans = new JsonObject();
        // ans.add("a", ... // what to write here? How to wrap a into JsonElement?
        return ans;
    }
}
类MyType1{
MyType2 a;/“主”字段
MyType3 b;//服务领域
}
类MySerializer实现JsonSerializer{
@凌驾
公共JsonElement序列化(MyType1 arg0,类型arg1,JsonSerializationContext arg2){
JsonObject ans=新的JsonObject();
//ans.add(“a”,…//在这里写什么?如何将a包装到JsonElement中?
返回ans;
}
}
我知道我可以使用
transient
关键字来处理这个特定的情况,但问题是如何编写序列化程序

更新

我强调使用transient并不是一个答案。我的问题是关于自定义序列化程序。如何编写它们

class MyTypeToSerialize {
   MyType2 a; // "main" field
}

class MyType1 extends MyTypeToSerialize {
   MyType3 b; // service fiels
}
如果您只想对字段
mytype2a
进行序列化/反序列化,请使用
MyTypeToSerialize
(您不需要自定义序列化程序或反序列化程序)

编辑:@Brian Roach的建议是更好、更简单的解决方案:

class MyType1 {
   MyType2 a; // "main" field
   transient MyType3 b; // service fiels
}
Edit2:

所以我只需要序列化“main”字段,并从中派生服务字段 他们

因此,请充分利用上述建议

我知道我可以在这个特殊的情况下使用transient关键字 问题是关于编写序列化程序


为什么您认为您需要序列化程序?

应该使用
上下文。序列化
以委派,如下所示:

class MySerializer implements JsonSerializer<MyType1> {
    @Override
    public JsonElement serialize(MyType1 arg0, Type arg1, JsonSerializationContext arg2) {
        JsonObject ans = new JsonObject();
        JsonElement a = arg2.serialize(a);
        ans.add("a", a);
        return ans;
    }
}
类MySerializer实现JsonSerializer{
@凌驾
公共JsonElement序列化(MyType1 arg0,类型arg1,JsonSerializationContext arg2){
JsonObject ans=新的JsonObject();
JsonElement a=arg2.serialize(a);
ans.add(“a”,a);
返回ans;
}
}

我在这里找到了答案:“嵌套对象”一节

不清楚您在这里要问什么。如果您不想序列化序列化程序中的某些字段,您只是…不会将它们添加到返回的JsonElement中。如何仅将
a
添加到
JsonElement
?如何将任何内容添加到
JsonElement
,知道它是抽象类?只需将
b
标记为
e> transient
也会做同样的事情。@BrianRoach我知道transient
,但我的问题是关于自定义序列化程序。@aegean我不想更改类层次结构,我想编写自定义序列化程序,保持类结构不变。我不明白为什么不想使用transient属性?为什么需要自定义序列化程序R