【问题标题】:Putting an Object into a ByteBuffer without serializing it将对象放入 ByteBuffer 而不对其进行序列化
【发布时间】:2011-08-15 21:43:43
【问题描述】:

我试图将一个对象放入 ByteBuffer 无济于事。

我正在尝试为 Android 创建一个模仿 DirectX/XNA 顶点缓冲区的 VertexBuffer 类。我的意思是我想允许任何类型的顶点结构(实现某个接口/扩展某个类。)为了做到这一点,我需要将该对象转换为 byte[]。

我研究了 Serializable、ByteArrayOutputStream 和 ObjectOutputStream,字节它给了我太多字节。前任。对于 x、y 和 z 具有 3 个浮点数的 Vertex 类应该是大约 3 * 4 或 12 个字节,但结果数组的长度为 51!我很确定额外的字节是序列化的结果,我可能只取数组末尾的字节,但这会更慢,如果有更简单的方法,我会更喜欢。

我还研究了使用 getClass 方法并递归地遍历字段,直到获得原始数据。使用原始数据,我可以使用相应的 put 方法将其直接放入 ByteBuffer 中。这是迄今为止最强大的方法(在我看来),但这似乎比仅使用序列化更困难。

编辑:顶点缓冲区类应该将顶点数据作为字节存储在 ByteBuffer(或其他扩展名)中。顶点数据类应该继承一个“getVertexDeclaration”方法,该方法告诉顶点缓冲区应该如何使用字节。例如:

public class ColoredTexturedVertex implements Vertex
{
    public Vector3 Position;
    public Vector2 TexCoord;
    public int Color;

    public VertexDeclaration getVertexDeclaration()
    {
         return VertexDeclaration.createFromArray(new VertexElement[] {
             new VertexElement(0, 4 * 3, Usage.Position),
             new VertexElement(12, 4 * 2, Usage.TexCoord),
             new VertexElement(20, 4 * 1, Usage.Color)
             });
    }
}

当传入顶点缓冲区时,这个类将告诉缓冲区它是一个带有位置、纹理坐标和颜色数据的顶点。 VertexDeclaration 反映了类的字段。前 12 个字节(Vector3)将用作位置数据。接下来的 8 个字节(Vector2)将用作纹理坐标。最后 4 个字节将用作颜色数据。

回到我的问题,我只是想隔离这些字节以存储在顶点缓冲区中。我在 ByteBuffer 中需要它们的原因是 glDrawElements 需要一个 Buffer 与它的其他参数一起传入。

我不想将顶点恢复到原始状态,所以我不需要序列化在创建字节时产生的所有额外内容。

我可以只使用浮点数组和 FloatBuffer,但如果我能弄清楚这将简化​​使用不同类型顶点的过程。

【问题讨论】:

    标签: java android bytebuffer


    【解决方案1】:

    Java 序列化使用一种特殊的格式,它可以被 Java 读取,并且允许恢复与写入的对象具有相同结构(和内容)的对象。如果您考虑到某些特定的接收器,这不是您想要的。 (你的问题在这里不是很清楚。)

    我真的不知道你的“顶点缓冲区”应该做什么,但你必须设计一个关于如何存储“任意顶点结构”对象的协议。如果这是某个接口给出的,则使用该接口的方法来存储数据。

    对不起,这有点含糊,但您的问题也含糊。

    【讨论】:

      【解决方案2】:

      序列化不只是将浮点数放入输出流:它还放入一些有关 Vertex 类的信息,以便 JVM 知道在反序列化发生时应该实例化哪个类。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-07-25
        • 2017-07-04
        • 1970-01-01
        • 1970-01-01
        • 2017-09-05
        • 2021-10-06
        • 2017-10-30
        • 1970-01-01
        相关资源
        最近更新 更多