MisterChangRay / magic-byte

a java tool for faster convertor byte2object
BSD 3-Clause "New" or "Revised" License
49 stars 20 forks source link

@MagicConverter 和 dynamicSize 没法共存 #47

Closed FULaBUla closed 10 months ago

FULaBUla commented 10 months ago

这两个一起使用会出现 dynamicSize & dynamicSizeOf only use one in the class; 错误,不知道是框架有 bug?还是报错信息不准确,不能这么用?

MisterChangRay commented 10 months ago

不会的, 这两个可以共同使用; 检查下,代码中应该存在两个可变数据区。

FULaBUla commented 10 months ago

不会的, 这两个可以共同使用; 检查下,代码中应该存在两个可变数据区。 下面这个代码就会报 dynamicSize & dynamicSizeOf only use one in the class; 异常


@MagicClass
public class A {
@MagicField(order = 1)
private int id;

@MagicField(order = 2)
@MagicConverter(converter = BConvert.class)
private String b;

public int getId() {
    return id;
}

public void setId(int id) {
    this.id = id;
}

public String getB() {
    return b;
}

public void setB(String b) {
    this.b = b;
}

@Override
public boolean equals(Object o) {
    if (this == o) return true;
    if (o == null || getClass() != o.getClass()) return false;
    A a = (A) o;
    return id == a.id && Objects.equals(b, a.b);
}

@Override
public int hashCode() {
    return Objects.hash(id, b);
}

public static class BConvert implements MConverter<String> {

    @Override
    public MResult<String> pack(int nextReadIndex, byte[] fullBytes, String[] attachParams, Class clz, Object obj) {
        A a = (A) obj;
        if (a.getId() == 1) {
            return MResult.build(1,  new String(Arrays.copyOfRange(fullBytes, nextReadIndex, nextReadIndex + 1)));
        } else {
            return MResult.build(2, new String(Arrays.copyOfRange(fullBytes, nextReadIndex, nextReadIndex + 2)));
        }
    }

    @Override
    public byte[] unpack(String object, String[] attachParams) {
        return object.getBytes(StandardCharsets.UTF_8);
    }
}

}

@MagicClass public class B {

@MagicField(order = 1)
private A a;

@MagicField(order = 2, dynamicSize = true, size = 10)
private byte[] data;

@MagicField(order = 3, size = 4)
private byte[] check;

public A getA() {
    return a;
}

public void setA(A a) {
    this.a = a;
}

public byte[] getData() {
    return data;
}

public void setData(byte[] data) {
    this.data = data;
}

public byte[] getCheck() {
    return check;
}

public void setCheck(byte[] check) {
    this.check = check;
}

@Override
public boolean equals(Object o) {
    if (this == o) return true;
    if (o == null || getClass() != o.getClass()) return false;
    B b = (B) o;
    return Objects.equals(a, b.a) && Arrays.equals(data, b.data) && Arrays.equals(check, b.check);
}

@Override
public int hashCode() {
    int result = Objects.hash(a);
    result = 31 * result + Arrays.hashCode(data);
    result = 31 * result + Arrays.hashCode(check);
    return result;
}

}

@Test
public void testDynamicSizeWithConvert() {
    MagicByte.configDefaultCharset(StandardCharsets.UTF_8);
    A a = new A();
    a.setId(1);
    a.setB("1");
    byte[] data = MagicByte.unpackToByte(a);
    A a1 = MagicByte.pack(data, A.class);
    Assert.assertEquals(a, a1);

    B b = new B();
    b.setA(a);
    b.setData("你好".getBytes());
    b.setCheck(new byte[4]);

    data = MagicByte.unpackToByte(b);
    B b1 = MagicByte.pack(data, B.class);
    Assert.assertEquals(b, b1);

}