有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java我的序列化程序相互依赖,如何确保两者都被使用

假设我有两个类,MyClassMyOtherClass。我已经为MyClass编写了一个序列化程序。没有它,尝试序列化MyOtherClass将不起作用(因为没有我编写的序列化程序MyClass就无法序列化)

package com.mycompany.javatest;

import com.google.gson.*;
import java.lang.reflect.*;

public class JavaTest {

    static class MyClass {

        private int someValue = 123;
    }

    static class MyOtherClass {

        private MyClass mc = new MyClass();
    }

    static class MyClassSerializer implements JsonSerializer<MyClass> {

        @Override
        public JsonElement serialize(MyClass t, Type type, JsonSerializationContext jsc) {

            JsonObject result = new JsonObject();
            // (Doing some magic to serialize the object here...)
            result.add("someValue", jsc.serialize(t.someValue));
            return result;

        }
    }

    static class MyOtherClassSerializer implements JsonSerializer<MyOtherClass> {

        @Override
        public JsonElement serialize(MyOtherClass t, Type type, JsonSerializationContext jsc) {

            JsonObject result = new JsonObject();
            result.add("mc", jsc.serialize(t.mc)); // <--- Will fail if not using the MyClassSerializer
            return result;

        }
    }

    public static void main(String[] args) {

        GsonBuilder gb = new GsonBuilder();
        gb.registerTypeAdapter(MyOtherClassSerializer.class, new MyOtherClassSerializer());
        Gson gson = gb.create();
        MyOtherClass object = new MyOtherClass();

        String json = gson.toJson(object, MyOtherClass.class); // <--- MyClassSerializer.serialize MUST be invoked, or this will fail

    }
}

我的问题是,当MyOtherClassSerializer被注册时,我如何强制MyClassSerializer被注册?显而易见的答案是只注册两个类型适配器,但我想知道在注册MyOtherClassSerializer时是否有办法强制注册这两个类型适配器。一个选项是只允许类型适配器通过这样的“register”方法访问,但我不喜欢这种解决方案。我仍然希望MyClassSerializer可以访问

public void registerMyOtherClassSerializer(GsonBuilder builder) {

    builder.registerTypeAdapter(MyClass.class, new MyClassSerializer());
    builder.registerTypeAdapter(MyOtherClass.class, new MyOtherClassSerializer());

}

想法


共 (1) 个答案

  1. # 1 楼答案

    多亏了托马斯·克莱格。这就是我最后做的:

    package com.mycompany.javatest;
    
    import com.google.gson.*;
    import com.google.gson.reflect.*;
    import com.google.gson.stream.*;
    import java.io.*;
    
    public class JavaTest {
    
        static class MyClass {
            private final int someValue = 123;
        }
    
        static class MyOtherClass {
            private final MyClass mc = new MyClass();
        }
    
        public static void main(String[] args) {
    
            GsonBuilder gb = new GsonBuilder();
            gb.registerTypeAdapterFactory(new MyTypeAdapterFactory());
            Gson gson = gb.create();
            MyOtherClass object = new MyOtherClass();
    
            String json = gson.toJson(object, MyOtherClass.class);
            System.out.println(json);
    
        }
    
        static class MyTypeAdapterFactory implements TypeAdapterFactory {
    
            @Override
            public <T> TypeAdapter<T> create(Gson gson, TypeToken<T> tt) {
    
                if (MyClass.class.isAssignableFrom(tt.getRawType())) {
                    return (TypeAdapter<T>) new MyClassAdapter();
                }
    
                return null;
            }
    
            private static class MyClassAdapter extends TypeAdapter<MyClass> {
    
                @Override
                public MyClass read(JsonReader reader) throws IOException {
                    throw new UnsupportedOperationException();
                }
    
                @Override
                public void write(JsonWriter writer, MyClass t) throws IOException {
                    writer.beginObject();
                    writer.name("someValue");
                    writer.value(t.someValue); // (Doing some magic to serialize the object here...)
                    writer.endObject();
                }
            }
        }
    }