【问题标题】:Can GSON handle static private nested classGSON 可以处理静态私有嵌套类吗
【发布时间】:2014-08-30 06:03:27
【问题描述】:

我正在使用一种设计,其中父类具有SparseArrayprivate static nested class。现在,如果我尝试使用 GSON 库对父对象进行 jsonify,它是否能够对我的父类对象进行 jsonify 和 de-jsonify,因为嵌套类实际上在外部不可见。代码如下所示。

class A {
  private SparseArray<B> array = new SparseArray<B>();

  private A() {}

  private static class B {
    private B() {}
    int example;
  }
  // static public accessors to access some methods of class A, no object of A outside A
}

我的另一个方面是我不希望任何人在外部创建父类的对象,因此我将默认构造函数保持为私有。我想知道GSON 在我的代码场景中是否会正常执行。

在我将其转换为 JSON 后,SparseList 中的对象似乎被转换为 null 而不是 jsonified 对象。

【问题讨论】:

  • sites.google.com/site/gson/gson-user-guide。检查嵌套类下的主题
  • @Raghunandan 没有提到私有静态嵌套类,他们说静态嵌套类可以工作,但如果它们是私有的,则没有。
  • 然后按照官方文档进行操作。
  • @Raghunandan 关注文档,您的意思是我应该公开我的课程??因为他们没有提到任何关于私有内部课程的内容,我如何关注有关此问题的文档。

标签: android serialization nested gson


【解决方案1】:

通过使用这个测试类找到了答案,发现GSON 可以与每个可见性修饰符无缝工作,无论是对于类、方法、实例变量还是构造函数,它是公共的还是私有的。我得到的错误是由于使用了SparseArray,如果它被替换为HashMap,它就像黄油一样工作。

package in.mubble.mubbletest;

import java.util.HashMap;

import android.annotation.SuppressLint;
import android.util.Log;

@SuppressLint("UseSparseArrays")
@SuppressWarnings("unused")
public class GSONTest {

  private HashMap<Integer, B> myMap;
  private String extra;

  private GSONTest() {
    Log.e("GSONTest", "default constructor GSONTEST was called");
  }

  public GSONTest(String extra) {
    myMap      = new HashMap<Integer, B>(); 
    this.extra = extra;
    myMap.put(1, new B(7));
    Log.e("GSONTest", "parameter constructor GSONTEST was called");
  }

  private static class B {
    int child;
    private B() {
      Log.e("B", "default constructor B was called");
    }

    private B(int child) {
      Log.e("B", "parameter constructor B was called");
      this.child = child;  
    }
  }

  public String toString() {
    return this.myMap.size() + ": " + this.extra + ", " + this.myMap.get(1).child;
  }

}

带有测试代码

GSONTest test = new GSONTest("hahaha");
Gson gson     = new Gson();    
String json   = gson.toJson(test);
Log.e("json", json);
GSONTest result = gson.fromJson(json, GSONTest.class);
Log.e("result", result.toString());

此代码在运行时会在 logcat 上生成此输出

parameter constructor B was called
parameter constructor GSONTEST was called
{"extra":"hahaha","myMap":{"1":{"child":7}}}
default constructor GSONTEST was called
default constructor B was called
1: hahaha, 7

【讨论】:

    猜你喜欢
    • 2015-01-26
    • 2020-02-16
    • 2014-05-31
    • 2016-01-05
    • 1970-01-01
    • 2013-08-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多