将对象放入ByteBuffer而不对其进行序列化

时间:2011-08-15 21:43:44

标签: java android bytebuffer

我试图将一个对象放入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。

我不想将顶点恢复到原始状态,因此我不需要在创建字节时将所有额外的东西序列化出来。

我可以使用float数组和FloatBuffer,但是如果我能解决这个问题会简化使用不同类型顶点的过程。

2 个答案:

答案 0 :(得分:1)

Java Serialization使用一种特殊格式,该格式由Java读取,允许恢复与书面结构相同的结构(和内容)对象。如果你有一些特定的接收器,这不是你想要的。 (你的问题在这里并不是很清楚。)

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

抱歉,这有点模糊,但你的问题也很模糊。

答案 1 :(得分:1)

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