Chronicle Map - 字段的值正在交换位置
Chronicle Map - values of fields are swapping places
我已经创建了值接口:
public interface SomeVal {
void setLevel1Description(@MaxUtf8Length(100) CharSequence level1Description);
CharSequence getLevel1Description();
void setLevel2Description(@MaxUtf8Length(100) CharSequence level2Description);
CharSequence getLevel2Description();
void setLevel3Description(@MaxUtf8Length(100) CharSequence level3Description);
CharSequence getLevel3Description();
}
然后我创建了编年史地图,一个条目的键,一个条目的值,我把这个条目放在创建的地图中:
ChronicleMap<LongValue, SomeVal> map = ChronicleMap
.of(LongValue.class, SomeVal.class)
.createPersistedTo(new File('cache'));
key = Values.newHeapInstance(LongValue.class);
key.setValue(1);
val = Values.newHeapInstance(SomeVal.class);
val.setLevel1Description("level 1 Desc");
val.setLevel2Description("level 2 Desc");
val.setLevel3Description("level 3 Desc");
map.put(key, val);
然后我触发了几次附加到创建的地图的过程,获取值并打印它:
//process starts (...)
ChronicleMap<LongValue, SomeVal> map = ChronicleMap
.of(LongValue.class, SomeVal.class)
.createPersistedTo(new File('cache'));
SomeVal result = map.get(key);
System.out.println(result);
//(...) process ends
对于某些运行,打印的条目状态正确。
但是有几次我得到了:
SomeVal{ level3Description=level 3 Desc, level1Description=level 2 Desc, level2Description=level 1 Desc }
level1Description 和 level2Description 的值交换了位置。
当我改名时:
level1Description -> l1Description
level2Description -> l2Description
level3Description -> l3Description
输入的打印值始终有效。
我在 Chronicle 文档中找不到对此的确切解释。所有提示都与值的大小有关(例如:averageValueSize()、constantKeySizeBySample() 等),而不是值接口中的方法命名。
我在不同版本的 chronicle-map 上检查过这个,即使是在 maven 存储库上可用的最新版本上,我总是,最终遇到了交换位置的问题。
您使用的 Java 是哪个版本?
对象的布局方式假定顺序方法的出现是稳定的,但是 JVM 不能保证这样做并且不同版本的行为可能不同(可能来自 运行 运行 )
解决这个问题的方法是 运行 使用 -DdumpCode=true
一次代码,这将向您显示在控制台上使用的生成代码(例如,即使在单元测试中)。您可以将此代码从控制台复制到您的代码库中,避免将来发生任何更改,但是如果您更改界面,则需要删除此代码并重复。
我已经创建了值接口:
public interface SomeVal {
void setLevel1Description(@MaxUtf8Length(100) CharSequence level1Description);
CharSequence getLevel1Description();
void setLevel2Description(@MaxUtf8Length(100) CharSequence level2Description);
CharSequence getLevel2Description();
void setLevel3Description(@MaxUtf8Length(100) CharSequence level3Description);
CharSequence getLevel3Description();
}
然后我创建了编年史地图,一个条目的键,一个条目的值,我把这个条目放在创建的地图中:
ChronicleMap<LongValue, SomeVal> map = ChronicleMap
.of(LongValue.class, SomeVal.class)
.createPersistedTo(new File('cache'));
key = Values.newHeapInstance(LongValue.class);
key.setValue(1);
val = Values.newHeapInstance(SomeVal.class);
val.setLevel1Description("level 1 Desc");
val.setLevel2Description("level 2 Desc");
val.setLevel3Description("level 3 Desc");
map.put(key, val);
然后我触发了几次附加到创建的地图的过程,获取值并打印它:
//process starts (...)
ChronicleMap<LongValue, SomeVal> map = ChronicleMap
.of(LongValue.class, SomeVal.class)
.createPersistedTo(new File('cache'));
SomeVal result = map.get(key);
System.out.println(result);
//(...) process ends
对于某些运行,打印的条目状态正确。 但是有几次我得到了:
SomeVal{ level3Description=level 3 Desc, level1Description=level 2 Desc, level2Description=level 1 Desc }
level1Description 和 level2Description 的值交换了位置。
当我改名时:
level1Description -> l1Description
level2Description -> l2Description
level3Description -> l3Description
输入的打印值始终有效。
我在 Chronicle 文档中找不到对此的确切解释。所有提示都与值的大小有关(例如:averageValueSize()、constantKeySizeBySample() 等),而不是值接口中的方法命名。
我在不同版本的 chronicle-map 上检查过这个,即使是在 maven 存储库上可用的最新版本上,我总是,最终遇到了交换位置的问题。
您使用的 Java 是哪个版本?
对象的布局方式假定顺序方法的出现是稳定的,但是 JVM 不能保证这样做并且不同版本的行为可能不同(可能来自 运行 运行 )
解决这个问题的方法是 运行 使用 -DdumpCode=true
一次代码,这将向您显示在控制台上使用的生成代码(例如,即使在单元测试中)。您可以将此代码从控制台复制到您的代码库中,避免将来发生任何更改,但是如果您更改界面,则需要删除此代码并重复。