gpt4 book ai didi

java - Array 的 Libgdx JSON 自定义序列化

转载 作者:行者123 更新时间:2023-11-30 08:19:32 26 4
gpt4 key购买 nike

我正在尝试编写一个自定义 JSON 序列化程序,它可以读取一个 float 组作为 Vector2 对象的坐标。假设我在我的类中有一个名为:

Array<Vector2> splinePoints;

我希望能够读写格式如下的 JSON 文件:

splinePoints: [0,0, 1,1, 2,2]

每对 float 被读取为 Vector2 对象的 x 和 y 坐标。这种格式允许我以最少的编辑复制和粘贴由 Inkscape 生成的样条点。此外,这比使用默认序列化程序的形式更紧凑:

splinePoints: [{x: 0, y: 0}, {x: 1, y: 1}, {x: 2, y: 2}]

到目前为止,我已经尝试过这段代码(这可能是非常错误的):

public class PointsHolder {
public Array<Vector2> splinePoints = new Array<Vector2>();
}

Json json = new Json();
json.setSerializer(PointsHolder.class, new Json.Serializer<PointsHolder>() {
public void write(Json json, PointsHolder pointsHolder, Class knownType) {
json.writeArrayStart();
for(Vector2 vector2: pointsHolder.splinePoints) {
json.writeValue(vector2.x);
json.writeValue(vector2.y);
}
json.writeArrayEnd();
}

public PointsHolder read(Json json, JsonValue jsonData, Class type) {
PointsHolder pointsHolder = new PointsHolder();
for (JsonValue child = jsonData.child; child != null; child = child.next) {
Vector2 vector2 = new Vector2();
vector2.x = jsonData.child.asFloat();
vector2.y = jsonData.child.next.asFloat();
pointsHolder.splinePoints.add(vector2);
}

return pointsHolder;
}
});

运行时,出现异常,提示无法将值转换为所需类型。即使在阅读了教程并浏览了源代码之后,我仍然无法理解 JSON 序列化程序的工作原理。读取数组时JsonValue jsonData指的是什么?读写方法中使用的第三个参数“Class”是什么?我是否需要为 Array.class 而不是 Vector2.class 编写序列化程序,尽管我仍然想为非 Vector2 类型的数组使用默认序列化程序?

最佳答案

问题出在您的read() 方法上。您在始终是第一个元素的循环内使用 jsonData.child。试试这个:

public PointsHolder read(Json json, JsonValue jsonData, Class type) {
PointsHolder pointsHolder = new PointsHolder();
for (JsonValue child = jsonData.child; child != null; child = child.next.next) {
Vector2 vector2 = new Vector2();
vector2.x = child.asFloat();
vector2.y = child.next.asFloat();
pointsHolder.splinePoints.add(vector2);
}

return pointsHolder;
}

我用最新版本测试了这段代码,它有效。

更新:我已经用字符串 [0,0, 1,1, 2,2] 测试了代码。如果你想反序列化像

{
splinePoints: [0,0, 1,1, 2,2]
}

你必须用新类包装你的 PointsHolder。像这样的东西:

public class PointsHolderWrapper
{
public PointsHolder splinePoints;
}

关于java - Array<Vector2> 的 Libgdx JSON 自定义序列化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26797620/

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