GSON无法为类FloatBuffer调用无构造函数

时间:2014-03-23 18:43:14

标签: java android object sharedpreferences gson

所以我试图加载一个对象,但由于某种原因,它抛出 gson无法为类java.nio.FloatBuffer 调用no-args构造函数: 保存工作 主类(加载函数为:

public void saveNode(RenderNode node, String key) {
    SharedPreferences.Editor ed = prefs.edit();
    Gson gson = new Gson();
    String json = gson.toJson(node);
    ed.putString(key, json);
    ed.commit();
}

public RenderNode loadNode(String key) throws IOException,
        ClassNotFoundException {
    Gson gson = new Gson();
    String json = prefs.getString(key, "");
    RenderNode obj = gson.fromJson(json, RenderNode.class);
    return obj;
}

对象:

    package com.uraniumdevelopers.etchcubes;


    public class RenderNode {
int nodeSize = 10;
Cube[][] cubes = new Cube[nodeSize][nodeSize];

public RenderNode() {
    float i1 = -5f, j1 = -5f;
    for (int i = 0; i < nodeSize; i++) {
        j1 = -5f;
        for (int j = nodeSize - 1; j >= 0; j--) {
            cubes[i][j] = new Cube(i1, j1, -5f);
            j1 += 1f;
        }
        i1 += 1f;
    }
}

public void renderNode() {
    for (int i = 0; i < nodeSize; i++) {
        for (int j = 0; j < nodeSize; j++) {
            if (cubes[i][j] != null)
                cubes[i][j].drawCube(shouldRender(i, j));
        }
    }
}

private int[] shouldRender(int i, int j) {
    int[] sR = new int[4];
    for (int k = 0; k < sR.length; k++) {
        sR[k] = 37;
    }
    if ((i - 1) > 0)
        if (cubes[i - 1][j] == null)
            sR[0] = 3 * 6;
    if ((i + 1) < (nodeSize - 1))
        if (cubes[i + 1][j] == null)
            sR[1] = 1 * 6;
    if ((j + 1) < (nodeSize - 1))
        if (cubes[i][j + 1] == null)
            sR[2] = 5 * 6;
    if ((j - 1) > 0)
        if (cubes[i][j - 1] == null)
            sR[3] = 4 * 6;
    return sR;
}

public void deleteCube(int i, int j) {
    if (!(i < 0 || i > nodeSize - 1 || j < 0 || j > nodeSize - 1))
        cubes[i][j] = null;
}
    }

和Cube对象:

    package com.uraniumdevelopers.etchcubes;

    import java.nio.ByteBuffer;
    import java.nio.ByteOrder;
    import java.nio.FloatBuffer;

    import android.opengl.GLES20;
    import android.opengl.Matrix;

    public class Cube {

private final FloatBuffer mCubePositions;
private final FloatBuffer mCubeColors;
private final FloatBuffer mCubeNormals;
float x, y, z;

public Cube(float x, float y, float z) {
    this.x = x;
    this.y = y;
    this.z = z;
    final float[] cubePositionData = {
            // Front face
            -1.0f, 1.0f, 1.0f, -1.0f, -1.0f, 1.0f, 1.0f, 1.0f, 1.0f, -1.0f,
            -1.0f, 1.0f, 1.0f, -1.0f,
            1.0f,
            1.0f,
            1.0f,
            1.0f,

            // Right face
            1.0f, 1.0f, 1.0f, 1.0f, -1.0f, 1.0f, 1.0f, 1.0f, -1.0f, 1.0f,
            -1.0f, 1.0f, 1.0f, -1.0f, -1.0f,
            1.0f,
            1.0f,
            -1.0f,

            // Back face
            1.0f, 1.0f, -1.0f, 1.0f, -1.0f, -1.0f, -1.0f, 1.0f, -1.0f,
            1.0f, -1.0f, -1.0f, -1.0f, -1.0f, -1.0f, -1.0f,
            1.0f,
            -1.0f,

            // Left face
            -1.0f, 1.0f, -1.0f, -1.0f, -1.0f, -1.0f, -1.0f, 1.0f, 1.0f,
            -1.0f, -1.0f, -1.0f, -1.0f, -1.0f, 1.0f, -1.0f, 1.0f,
            1.0f,

            // Top face
            -1.0f, 1.0f, -1.0f, -1.0f, 1.0f, 1.0f, 1.0f, 1.0f, -1.0f,
            -1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, -1.0f,

            // Bottom face
            1.0f, -1.0f, -1.0f, 1.0f, -1.0f, 1.0f, -1.0f, -1.0f, -1.0f,
            1.0f, -1.0f, 1.0f, -1.0f, -1.0f, 1.0f, -1.0f, -1.0f, -1.0f, };

    final float[] cubeColorData = {
            // Front face (red)
            1.0f, 0.0f, 0.0f, 1.0f, 1.0f, 0.0f, 0.0f, 1.0f, 1.0f, 0.0f,
            0.0f, 1.0f, 1.0f, 0.0f,
            0.0f,
            1.0f,
            1.0f,
            0.0f,
            0.0f,
            1.0f,
            1.0f,
            0.0f,
            0.0f,
            1.0f,

            // Right face (green)
            0.0f, 1.0f, 0.0f, 1.0f, 0.0f, 1.0f, 0.0f, 1.0f, 0.0f, 1.0f,
            0.0f, 1.0f, 0.0f, 1.0f, 0.0f, 1.0f,
            0.0f,
            1.0f,
            0.0f,
            1.0f,
            0.0f,
            1.0f,
            0.0f,
            1.0f,

            // Back face (blue)
            0.0f, 0.0f, 1.0f, 1.0f, 0.0f, 0.0f, 1.0f, 1.0f, 0.0f, 0.0f,
            1.0f, 1.0f, 0.0f, 0.0f, 1.0f, 1.0f, 0.0f, 0.0f,
            1.0f,
            1.0f,
            0.0f,
            0.0f,
            1.0f,
            1.0f,

            // Left face (yellow)
            1.0f, 1.0f, 0.0f, 1.0f, 1.0f, 1.0f, 0.0f, 1.0f, 1.0f, 1.0f,
            0.0f, 1.0f, 1.0f, 1.0f, 0.0f, 1.0f, 1.0f, 1.0f, 0.0f, 1.0f,
            1.0f,
            1.0f,
            0.0f,
            1.0f,

            // Top face (cyan)
            0.0f, 1.0f, 1.0f, 1.0f, 0.0f, 1.0f, 1.0f, 1.0f, 0.0f, 1.0f,
            1.0f, 1.0f, 0.0f, 1.0f, 1.0f, 1.0f, 0.0f, 1.0f, 1.0f, 1.0f,
            0.0f, 1.0f, 1.0f,
            1.0f,

            // Bottom face (magenta)
            1.0f, 0.0f, 1.0f, 1.0f, 1.0f, 0.0f, 1.0f, 1.0f, 1.0f, 0.0f,
            1.0f, 1.0f, 1.0f, 0.0f, 1.0f, 1.0f, 1.0f, 0.0f, 1.0f, 1.0f,
            1.0f, 0.0f, 1.0f, 1.0f };

    final float[] cubeNormalData = {
            // Front face
            0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 1.0f, 0.0f,
            0.0f, 1.0f, 0.0f, 0.0f,
            1.0f,
            0.0f,
            0.0f,
            1.0f,

            // Right face
            1.0f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 1.0f,
            0.0f, 0.0f, 1.0f, 0.0f, 0.0f,
            1.0f,
            0.0f,
            0.0f,

            // Back face
            0.0f, 0.0f, -1.0f, 0.0f, 0.0f, -1.0f, 0.0f, 0.0f, -1.0f, 0.0f,
            0.0f, -1.0f, 0.0f, 0.0f, -1.0f, 0.0f,
            0.0f,
            -1.0f,

            // Left face
            -1.0f, 0.0f, 0.0f, -1.0f, 0.0f, 0.0f, -1.0f, 0.0f, 0.0f, -1.0f,
            0.0f, 0.0f, -1.0f, 0.0f, 0.0f, -1.0f, 0.0f,
            0.0f,

            // Top face
            0.0f, 1.0f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f,
            1.0f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 1.0f, 0.0f,

            // Bottom face
            0.0f, -1.0f, 0.0f, 0.0f, -1.0f, 0.0f, 0.0f, -1.0f, 0.0f, 0.0f,
            -1.0f, 0.0f, 0.0f, -1.0f, 0.0f, 0.0f, -1.0f, 0.0f };
    mCubePositions = ByteBuffer
            .allocateDirect(
                    cubePositionData.length * Renderer.mBytesPerFloat)
            .order(ByteOrder.nativeOrder()).asFloatBuffer();
    mCubePositions.put(cubePositionData).position(0);

    mCubeColors = ByteBuffer
            .allocateDirect(cubeColorData.length * Renderer.mBytesPerFloat)
            .order(ByteOrder.nativeOrder()).asFloatBuffer();
    mCubeColors.put(cubeColorData).position(0);

    mCubeNormals = ByteBuffer
            .allocateDirect(cubeNormalData.length * Renderer.mBytesPerFloat)
            .order(ByteOrder.nativeOrder()).asFloatBuffer();
    mCubeNormals.put(cubeNormalData).position(0);
}

public void drawCube(int[] draw) {
    Matrix.setIdentityM(Renderer.mModelMatrix, 0);
    Matrix.translateM(Renderer.mModelMatrix, 0, x + 0.5f, y, z);
    Matrix.scaleM(Renderer.mModelMatrix, 0, 0.5f, 0.5f, 0.5f);
    mCubePositions.position(0);
    GLES20.glVertexAttribPointer(Renderer.mPositionHandle,
            Renderer.mPositionDataSize, GLES20.GL_FLOAT, false, 0,
            mCubePositions);
    GLES20.glEnableVertexAttribArray(Renderer.mPositionHandle);
    mCubeColors.position(0);
    GLES20.glVertexAttribPointer(Renderer.mColorHandle,
            Renderer.mColorDataSize, GLES20.GL_FLOAT, false, 0, mCubeColors);
    GLES20.glEnableVertexAttribArray(Renderer.mColorHandle);
    mCubeNormals.position(0);
    GLES20.glVertexAttribPointer(Renderer.mNormalHandle,
            Renderer.mNormalDataSize, GLES20.GL_FLOAT, false, 0,
            mCubeNormals);
    GLES20.glEnableVertexAttribArray(Renderer.mNormalHandle);
    Matrix.multiplyMM(Renderer.mMVPMatrix, 0, Renderer.mViewMatrix, 0,
            Renderer.mModelMatrix, 0);
    GLES20.glUniformMatrix4fv(Renderer.mMVMatrixHandle, 1, false,
            Renderer.mMVPMatrix, 0);
    Matrix.multiplyMM(Renderer.mMVPMatrix, 0, Renderer.mProjectionMatrix,
            0, Renderer.mMVPMatrix, 0);
    GLES20.glUniformMatrix4fv(Renderer.mMVPMatrixHandle, 1, false,
            Renderer.mMVPMatrix, 0);
    GLES20.glUniform3f(Renderer.mLightPosHandle,
            Renderer.mLightPosInEyeSpace[0],
            Renderer.mLightPosInEyeSpace[1],
            Renderer.mLightPosInEyeSpace[2]);
    for (int i = 0; i < draw.length; i++) {
        if (draw[i] != 37)
            GLES20.glDrawArrays(GLES20.GL_TRIANGLES, draw[i], 6);
    }
    GLES20.glDrawArrays(GLES20.GL_TRIANGLES, 0, 6);
}

public float getX() {
    return x;
}

public float getY() {
    return y;
}

public float getZ() {
    return z;
}
    }

堆栈跟踪:

03-23 20:32:09.257: E/AndroidRuntime(14477): FATAL EXCEPTION: main
03-23 20:32:09.257: E/AndroidRuntime(14477): java.lang.RuntimeException: Unable to invoke no-args constructor for class java.nio.FloatBuffer. Register an InstanceCreator with Gson for this type may fix this problem.
03-23 20:32:09.257: E/AndroidRuntime(14477):    at com.google.gson.internal.ConstructorConstructor$8.construct(ConstructorConstructor.java:167)
03-23 20:32:09.257: E/AndroidRuntime(14477):    at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.read(ReflectiveTypeAdapterFactory.java:162)
03-23 20:32:09.257: E/AndroidRuntime(14477):    at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$1.read(ReflectiveTypeAdapterFactory.java:93)
03-23 20:32:09.257: E/AndroidRuntime(14477):    at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.read(ReflectiveTypeAdapterFactory.java:172)
03-23 20:32:09.257: E/AndroidRuntime(14477):    at com.google.gson.internal.bind.TypeAdapterRuntimeTypeWrapper.read(TypeAdapterRuntimeTypeWrapper.java:40)
03-23 20:32:09.257: E/AndroidRuntime(14477):    at com.google.gson.internal.bind.ArrayTypeAdapter.read(ArrayTypeAdapter.java:72)
03-23 20:32:09.257: E/AndroidRuntime(14477):    at com.google.gson.internal.bind.TypeAdapterRuntimeTypeWrapper.read(TypeAdapterRuntimeTypeWrapper.java:40)
03-23 20:32:09.257: E/AndroidRuntime(14477):    at com.google.gson.internal.bind.ArrayTypeAdapter.read(ArrayTypeAdapter.java:72)
03-23 20:32:09.257: E/AndroidRuntime(14477):    at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$1.read(ReflectiveTypeAdapterFactory.java:93)
03-23 20:32:09.257: E/AndroidRuntime(14477):    at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.read(ReflectiveTypeAdapterFactory.java:172)
03-23 20:32:09.257: E/AndroidRuntime(14477):    at com.google.gson.Gson.fromJson(Gson.java:795)
03-23 20:32:09.257: E/AndroidRuntime(14477):    at com.google.gson.Gson.fromJson(Gson.java:761)
03-23 20:32:09.257: E/AndroidRuntime(14477):    at com.google.gson.Gson.fromJson(Gson.java:710)
03-23 20:32:09.257: E/AndroidRuntime(14477):    at com.google.gson.Gson.fromJson(Gson.java:682)
03-23 20:32:09.257: E/AndroidRuntime(14477):    at com.uraniumdevelopers.etchcubes.MainActivity.loadNode(MainActivity.java:184)
03-23 20:32:09.257: E/AndroidRuntime(14477):    at com.uraniumdevelopers.etchcubes.MainActivity$1.onClick(MainActivity.java:89)
03-23 20:32:09.257: E/AndroidRuntime(14477):    at com.android.internal.app.AlertController$AlertParams$3.onItemClick(AlertController.java:934)
03-23 20:32:09.257: E/AndroidRuntime(14477):    at android.widget.AdapterView.performItemClick(AdapterView.java:301)
03-23 20:32:09.257: E/AndroidRuntime(14477):    at android.widget.AbsListView.performItemClick(AbsListView.java:1280)
03-23 20:32:09.257: E/AndroidRuntime(14477):    at android.widget.AbsListView$PerformClick.run(AbsListView.java:3071)
03-23 20:32:09.257: E/AndroidRuntime(14477):    at android.widget.AbsListView$1.run(AbsListView.java:3973)
03-23 20:32:09.257: E/AndroidRuntime(14477):    at android.os.Handler.handleCallback(Handler.java:615)
03-23 20:32:09.257: E/AndroidRuntime(14477):    at android.os.Handler.dispatchMessage(Handler.java:92)
03-23 20:32:09.257: E/AndroidRuntime(14477):    at android.os.Looper.loop(Looper.java:137)
03-23 20:32:09.257: E/AndroidRuntime(14477):    at android.app.ActivityThread.main(ActivityThread.java:4960)
03-23 20:32:09.257: E/AndroidRuntime(14477):    at java.lang.reflect.Method.invokeNative(Native Method)
03-23 20:32:09.257: E/AndroidRuntime(14477):    at java.lang.reflect.Method.invoke(Method.java:511)
03-23 20:32:09.257: E/AndroidRuntime(14477):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1038)
03-23 20:32:09.257: E/AndroidRuntime(14477):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:805)
03-23 20:32:09.257: E/AndroidRuntime(14477):    at dalvik.system.NativeStart.main(Native Method)
03-23 20:32:09.257: E/AndroidRuntime(14477): Caused by: java.lang.reflect.InvocationTargetException
03-23 20:32:09.257: E/AndroidRuntime(14477):    at java.lang.reflect.Method.invokeNative(Native Method)
03-23 20:32:09.257: E/AndroidRuntime(14477):    at java.lang.reflect.Method.invoke(Method.java:511)
03-23 20:32:09.257: E/AndroidRuntime(14477):    at com.google.gson.internal.UnsafeAllocator$3.newInstance(UnsafeAllocator.java:90)
03-23 20:32:09.257: E/AndroidRuntime(14477):    at com.google.gson.internal.ConstructorConstructor$8.construct(ConstructorConstructor.java:164)
03-23 20:32:09.257: E/AndroidRuntime(14477):    ... 29 more
03-23 20:32:09.257: E/AndroidRuntime(14477): Caused by: java.lang.InstantiationException: can't instantiate class java.nio.FloatBuffer; abstract class or interface
03-23 20:32:09.257: E/AndroidRuntime(14477):    at java.io.ObjectStreamClass.newInstance(Native Method)
03-23 20:32:09.257: E/AndroidRuntime(14477):    ... 33 more

1 个答案:

答案 0 :(得分:1)

你永远不应该实际保存它,它应该是一个静态字段!