android如何将对象存储和维护组成

标签: Java Android gson
发布时间: 2017/3/19 18:02:13
注意事项: 本文中文内容可能为机器翻译,如要查看英文原文请点击上面连接.

这些人上课︰

class A implements Composite
{
    Composite b = new B();
}

class B implements Composite
{
}

interface Composite
{
}

基本上 A 组成的 B 和我想要将它们维持这篇作文在文件中的存储。

Activity 我这样做︰

String filename = "myfile.txt";

A a = new A();

Gson gson = new Gson();
String s = son.toJson(a);

FileOutputStream outputStream;
try
{
   outputStream = openFileOutput(filename, Context.MODE_PRIVATE);
   outputStream.write(s.getBytes);
   outputStream.close();
}
catch(Exception e)
{
}

然后我使用这段代码来读取︰

FileInputStream fileInputStream = null;
try
{
    fileInputStream = openFileInput(filename);
}
catch(FileNotFoundException e)
{}

InputStreamReader inputStreamReader = new InputStreamReader(fileInputStream)l;
BufferReader bufferedReader = new BufferedReader(inputStreamReader);
StringBuilder stringBuilder = new StringBuilder();

String line;

try
{
   while((line = bufferedReader.readLine()) != null)
   {
      stringBuilder.append(line);
   }
}
catch(IOException e)
{
}

String json = stringBuilder.toString();
Gson gson2 = new Gson();

// Exception here.
A a2 = gson2.fromJson(json, A.class);

问题是与对象 B 类 A.Gson 似乎并不知道里面的 typeB 。那么此异常︰

JNI 检测到的错误 application ︰ 不能使对象的 type 复合

解决方法 1:

问题是接口具有任何属性,所以你需要序列化实现该接口的类。你需要使用生成器创建 Gson 实例

GsonBuilder builder = new GsonBuilder();
builder.registerTypeAdapter(Composite.class, new CompositeAdapter());
Gson gson = builder.create();

并定义代码,以序列化您复合的实例

public static class CompositeAdapter implements JsonSerializer<Composite>, JsonDeserializer<Composite> {

    private static final String CLASSNAME = "CLASSNAME";
    private static final String DATA = "DATA";

    public Composite deserialize(JsonElement jsonElement, Type type,
                         JsonDeserializationContext jsonDeserializationContext) throws JsonParseException {

        JsonObject jsonObject = jsonElement.getAsJsonObject();
        JsonPrimitive prim = (JsonPrimitive) jsonObject.get(CLASSNAME);
        String className = prim.getAsString();
        Class klass = null;
        try {
            klass = Class.forName(className);
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
            // TODO: handle somehow
        }
        return jsonDeserializationContext.deserialize(jsonObject.get(DATA), klass);
    }

    public JsonElement serialize(Composite jsonElement, Type type, JsonSerializationContext jsonSerializationContext) {
        JsonObject jsonObject = new JsonObject();
        jsonObject.addProperty(CLASSNAME, jsonElement.getClass().getName());
        jsonObject.add(DATA, jsonSerializationContext.serialize(jsonElement));
        return jsonObject;
    }
}

基本上当它序列化一个复合的实例同时将存储类名加属性和反序列化它将在创建时 (说 B) 实际类的一个实例。这种方式你不必担心创建序列化和反序列化程序为每个类都实现复合,但如果您更改类 (完整的名称,包括包名称) 的名称不能以反序列化

官方微信
官方QQ群
31647020