gpt4 book ai didi

java - GSON 无法调用 FloatBuffer 类的无构造函数

转载 作者:行者123 更新时间:2023-12-01 13:14:10 29 4
gpt4 key购买 nike

所以我试图加载一个对象,但由于某种原因它抛出gson无法调用类java.nio.FloatBuffer的无参数构造函数:保存作品主类(其中加载函数是:

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;
}
}

还有立方体对象:

    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

最佳答案

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

关于java - GSON 无法调用 FloatBuffer 类的无构造函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22595318/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com