是否有直接方法来计算基本字段的大小?

银爪

我正在写一个小的序列化实用程序,我想计算将一个对象写入字节数组需要保留多少字节。假设我有一堂课,其中有一些字段/获取者,例如

int age;
String name;
Colour colour;
boolean active;
...

我以为可以使用反射遍历字段并查看它们的大小,但是我所能做的就是检查它们是否原始。这是一个开始,因为我将short用作Objects的偏移量。好吧,我可以用

if(field.getType() == int.class) {
    size = Integer.BYTES;
}

或使用地图。这并不难,因为我只需要知道基元的大小即可。但是出于好奇:有什么直接的方法吗?

编辑以澄清:我正在使用它来序列化数据,基本上像DataOutput / InputStream一样,但是有一些我自己想要的调整。

API类如下所示:

public final void write(int i) {
    checkBounds(Integer.BYTES);
    PrimitiveWriteUtil.write(i, data, marker);
    advance(Integer.BYTES);
}

实际工作由实用程序类完成:

public static void write(int i, byte[] target, int pos) {
    target[pos] =       (byte) ((i >>> 24) & 0xFF);
    target[pos + 1] =   (byte) ((i >>> 16) & 0xFF);
    target[pos + 2] =   (byte) ((i >>>  8) & 0xFF);
    target[pos + 3] =   (byte) ((i >>>  0) & 0xFF);
}

因此,我想知道字节数组的所需大小,以便避免以后进行检查和调整大小的工作。

霍尔格

好了,您已经知道该BYTES字段,问题是,这些字段是在相应的包装器类型中声明的,没有简单的方法来获取原始类型的包装器类型。就代码大小而言,最简单的获取方法是通过get隐含原始值包装方法读取字段

public class FieldSize {
    static final int BOOLEAN_SIZE = 1; // adjust to your storage method
    static final int REF_SIZE = 2;     // dito
    private static int getSize(Field f, Object o) {
        try {
        return f.getType().isPrimitive()? f.getType()==boolean.class? BOOLEAN_SIZE:
               f.get(o).getClass().getField("BYTES").getInt(null): REF_SIZE;
        } catch(ReflectiveOperationException ex) {
            throw new AssertionError(ex);
        }
    }
    boolean z;
    byte b;
    short s;
    char c;
    int i;
    long l;
    float f;
    double d;
    String str;

    public static void main(String[] args) {
        System.out.println("total: "+calculateSize(new FieldSize())+" size");
    }
    static int calculateSize(Object o) {
        int total=0;
        for(Class cl=o.getClass(); cl!=null; cl=cl.getSuperclass()) {
            for(Field f: cl.getDeclaredFields()) {
                if(Modifier.isStatic(f.getModifiers())) continue;
                int size=getSize(f, o);
                System.out.println(f.getName()+" ("+f.getType()+"): "+size);
                total+=size;
            }
        }
        return total;
    }
}

但是,就底层操作而言,它不是最简单的解决方案,如果您不喜欢它,我将完全理解。

在那种情况下,答案是没有简单/直接的方法来获取这些数字,因此不可避免地要进行从类型到数字的映射或对这八种可能性进行线性探测,因此也是最简单的(可用的)解决方案。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

是否有直接方法来测试加密会话(SSL)Cookie中的安全属性

来自分类Dev

是否有更好的方法来调整以numpy数组形式显示的图像的大小?

来自分类Dev

是否有一种简单的方法来获取特定网络文件夹的大小?

来自分类Dev

是否有Python方法来计算空间复杂度?

来自分类Dev

是否有一种简单的方法来计算产品订单所需的纸箱?

来自分类Dev

是否有预定义的方法来计算Nutiteq中的多边形面积?

来自分类Dev

是否有非 VBA 方法来计算两组列的总和的平均值?

来自分类Dev

是否有一种简便的方法来更新球拍中的特定结构字段?

来自分类Dev

使用 Word 的邮件合并时,是否有更快的方法来输入每个邮件合并字段?

来自分类Dev

除了使用tranwrd函数之外,是否有更好的方法来替换sas文本字符串

来自分类Dev

有没有更好的方法来计算重量

来自分类Dev

是否有一种直接的方法来连接两个或多个矩阵,同时避免重复元素?

来自分类Dev

有没有一种方法来创建带有在flutter中始终可见的前缀的文本字段

来自分类Dev

Maven / Gradle方法来计算依赖项的总大小,包括其所有可传递依赖项

来自分类Dev

有没有更好的方法来查看Lua表中是否存在用false初始化的字段

来自分类Dev

是否有已知的方法来更新Google幻灯片API中的页面设置大小?

来自分类Dev

是否有任何统一的方法来计算 PerformanceCounter 的任何类别中的任何计数器?

来自分类Dev

是否有一种计算速度更快的方法来进行这种数据转换?

来自分类Dev

是否有python方法来验证文件或URL的存在?

来自分类Dev

TSQL:是否有更快或更佳的方法来加密值?

来自分类Dev

是否有更好的方法来减轻此警告?

来自分类Dev

是否有内置的方法来获取父对象?

来自分类Dev

indexOf():是否有更好的方法来实现呢?

来自分类Dev

有没有一种方法来检查instanceof基本变量java

来自分类Dev

sass断点是否具有基本字体大小设置?

来自分类Dev

寻找更好的方法来计算矩阵

来自分类Dev

递归方法来计算日志

来自分类Dev

递归方法来计算日志

来自分类Dev

RESTFul方法来更新字段

Related 相关文章

  1. 1

    是否有直接方法来测试加密会话(SSL)Cookie中的安全属性

  2. 2

    是否有更好的方法来调整以numpy数组形式显示的图像的大小?

  3. 3

    是否有一种简单的方法来获取特定网络文件夹的大小?

  4. 4

    是否有Python方法来计算空间复杂度?

  5. 5

    是否有一种简单的方法来计算产品订单所需的纸箱?

  6. 6

    是否有预定义的方法来计算Nutiteq中的多边形面积?

  7. 7

    是否有非 VBA 方法来计算两组列的总和的平均值?

  8. 8

    是否有一种简便的方法来更新球拍中的特定结构字段?

  9. 9

    使用 Word 的邮件合并时,是否有更快的方法来输入每个邮件合并字段?

  10. 10

    除了使用tranwrd函数之外,是否有更好的方法来替换sas文本字符串

  11. 11

    有没有更好的方法来计算重量

  12. 12

    是否有一种直接的方法来连接两个或多个矩阵,同时避免重复元素?

  13. 13

    有没有一种方法来创建带有在flutter中始终可见的前缀的文本字段

  14. 14

    Maven / Gradle方法来计算依赖项的总大小,包括其所有可传递依赖项

  15. 15

    有没有更好的方法来查看Lua表中是否存在用false初始化的字段

  16. 16

    是否有已知的方法来更新Google幻灯片API中的页面设置大小?

  17. 17

    是否有任何统一的方法来计算 PerformanceCounter 的任何类别中的任何计数器?

  18. 18

    是否有一种计算速度更快的方法来进行这种数据转换?

  19. 19

    是否有python方法来验证文件或URL的存在?

  20. 20

    TSQL:是否有更快或更佳的方法来加密值?

  21. 21

    是否有更好的方法来减轻此警告?

  22. 22

    是否有内置的方法来获取父对象?

  23. 23

    indexOf():是否有更好的方法来实现呢?

  24. 24

    有没有一种方法来检查instanceof基本变量java

  25. 25

    sass断点是否具有基本字体大小设置?

  26. 26

    寻找更好的方法来计算矩阵

  27. 27

    递归方法来计算日志

  28. 28

    递归方法来计算日志

  29. 29

    RESTFul方法来更新字段

热门标签

归档