小编orb*_*ish的帖子

使用readClassDescriptor()和resolveClass()来允许序列化版本控制

我正在研究Java序列化机制中的不同选项,以允许我们的类结构灵活地进行版本容忍存储(并提倡不同的机制,您不需要告诉我).

例如,如果只需要向后兼容性,则默认序列化机制可以处理添加和删除字段.

但是,重命名一个类或将它移动到另一个包中已经证明要困难得多.我在这个问题中发现我能够通过继承ObjectInputStream并覆盖readClassDescriptor()来做一个简单的类重命名和/或移动包:

    if (resultClassDescriptor.getName().equals("package.OldClass"))
        resultClassDescriptor = ObjectStreamClass.lookup(newpackage.NewClass.class);
Run Code Online (Sandbox Code Playgroud)

对于简单的重命名,这很好.但是,如果您尝试添加或删除字段,则会收到java.io.StreamCorruptedException.更糟糕的是,即使添加或删除了某个字段,然后重命名该类,也会发生这种情况,这可能会导致多个开发人员或多个签名出现问题.

基于我已经完成的一些阅读,我尝试了一下同样重写了resolveClass(),并且我们正确地将名称重新命名为新类,但没有加载旧类本身并轰炸字段更改.但这来自于对序列化机制的一些细节的非常模糊的理解,我不确定我是否甚至咆哮着正确的树.

所以2个确切的问题:

  1. 为什么使用readClassDescriptor()重新创建类名,导致反序列化在正常的兼容类更改时失败?
  2. 有没有办法使用resolveClass()或其他机制来解决这个问题并允许类进化(添加和删除字段)并重命名/重新打包?

我四处寻找,无法在SO上找到一个同等的问题.无论如何,请指出这样一个问题,如果它存在,但请仔细阅读这个问题,除非另一个问题实际上回答了我的确切问题,否则你不要关闭我.

java version-control serialization version deserialization

5
推荐指数
1
解决办法
2429
查看次数

如何将Subversion存储库(而不是我的工作副本)还原到特定版本?

我对来自Source Safe的Subversion相对较新,这让我疯狂.使用Tortoise接口,Commit继续在我的bin目录中显示.java文件,它说它"丢失" - 好吧,这是一个单独的问题.基本上,当我尝试了几件事来摆脱虚假的"bin"消息时,Tortoise反而删除了我的整个源目录.我尝试重新添加东西,但是当我添加时,它是新的,没有历史.

如何将Subversion恢复到特定版本?好像我从未发生过?我知道如何在VSS中执行此操作,但每次我在TortoiseSVN中尝试时,它只是修改我的工作副本.我不想再查看我的工作副本,因为这会让我失去我的所有历史.Subversion可以忘记吗?

尝试查看stackoverflow,顺便说一句,但我发现最接近的事情是导出并重新导入整个存储库,我不认为我现在还在那.Subversion必须能够做到这一点最简单的事情!

svn tortoisesvn revert

4
推荐指数
1
解决办法
4365
查看次数

在创建套件时如何让Eclipse识别JUnit测试?

当我使用Eclipse创建JUnit测试套件时,它不会检测任何现有测试,并警告"未选择任何测试类".

我从测试类包(test/com /.../ package)开始,选择了包.那里有几个JUnit测试,也是通过相同版本的Eclipse创建的,但没有办法选择它们.

我正在使用JUnit 4.

谢谢!

java eclipse junit suite

4
推荐指数
1
解决办法
3058
查看次数

如何在没有类的情况下使用Hibernate composite-id?

我试图在xml中映射一个键,如下所示:

    <composite-id>
        <key-property name="userId" column="USER_ID" />
        <key-property name="passwordsBack" column="PASSWORDS_BACK" />
    </composite-id>
Run Code Online (Sandbox Code Playgroud)

我在文档中的"Hibernate in Action"和其他地方看到过这种构造,没有class ="BlahPK".但是,当我尝试获取时,我得到:

Initial SessionFactory creation failed.org.hibernate.MappingException: composite-id class must implement Serializable: MyClass
Run Code Online (Sandbox Code Playgroud)

这是一个非常简单的数据类,它不是可变的,我不需要一个键,当然也不想重新构建我的对象并定义一个单独的公共类只是为了用Hibernate读取它.目前,我已经知道使用rowid作为id,但我宁愿让映射干净地反映表和对象的使用方式.

免责声明:我搜索了StackOverflow,我发现的是 如何处理复合键休眠,它只是说"不要这样做,但你可以".

java orm hibernate hibernate-mapping

4
推荐指数
1
解决办法
2万
查看次数

如何在Maven pom.xml中指定测试目录

Maven通过默认处理来处理java单元测试:

src/test/java
Run Code Online (Sandbox Code Playgroud)

我们现在正在编写相当多的Groovy单元测试,我想在Maven中找到一种方法来指定一个文件夹,例如:

src/test/groovy
Run Code Online (Sandbox Code Playgroud)

作为测试文件夹.这将有助于我们将Maven项目导入到IntelliJ中,而无需额外的设置.

有人提到这是可能的,但我找不到搜索Maven文档或SO的方法.有谁知道如何在pom中标记目录?

谢谢

更新:我不是在询问如何在Maven中运行测试!测试已经运行良好.我问如何将目录标记为Maven中的测试目录.

groovy unit-testing pom.xml maven

4
推荐指数
1
解决办法
2万
查看次数

How to evaluate Spock @IgnoreIf using a method

According to the following article:

https://dzone.com/articles/spocklight-ignore

you should be able to evaluate the Spock @IgnoreIf annotation using a static method. I tried the isOsWindows() method exactly as in the article, and got the following:

org.spockframework.runtime.extension.ExtensionException: Failed to evaluate @IgnoreIf condition
...
Caused by: groovy.lang.MissingMethodException: No signature of method: MySpec$__spock_feature_1_3_closure1.isOsWindows() is applicable for argument types: () values: []
Run Code Online (Sandbox Code Playgroud)

Does anyone have any insight on this? I really want to just set a true/false per spec, I don't need any of the …

groovy spock

3
推荐指数
1
解决办法
1788
查看次数

如何使用 Java 8 groupingBy 收集不同类型的列表?

我正在尝试获取类型A -> A为 的地图,并将其分组为A to List<A>. (也颠倒了键值关系,但我认为这不一定相关)。

这就是我现在所拥有的:

private static Map<Thing, List<Thing>> consolidateMap(Map<Thing, Thing> releasedToDraft) {

    // Map each draft Thing back to the list of released Things (embedded in entries)
    Map<Thing, List<Map.Entry<Thing, Thing>>> draftToEntry = releasedToDraft.entrySet().stream()
            .collect(groupingBy(
                    Map.Entry::getValue,
                    toList()
            ));

    // Get us back to the map we want (Thing to list of Things)
    return draftToEntry.entrySet().stream()
            .collect(toMap(
                    Map.Entry::getKey,
                    ThingReleaseUtil::entriesToThings
            ));
}

private static List<Thing> entriesToThings(Map.Entry<Thing, List<Map.Entry<Thing, Thing>>> entry) {
    return entry.getValue().stream()
            .map(Map.Entry::getKey)
            .collect(toList());
}
Run Code Online (Sandbox Code Playgroud)

我想在单个语句中执行此操作,并且我觉得必须可以将 …

java reducing java-8 groupingby

2
推荐指数
1
解决办法
141
查看次数

有没有将SAS转换为SQL的工具?

我遇到了一个4页的SAS东西 - 宏?程序?它有程序,DATA块和PROC块,一个用于从Oracle导入的PROC SQL块.

有没有一种工具可以将SAS转换为可读的东西?理想的是SQL或PL/SQL(这两者似乎都适用),但几乎任何程序都是一种改进.我不需要可运行的东西,只需要人类可读的东西.

我已经知道2种死语言(TAL和TACL) - 有人请我免于学习SAS.

sql oracle plsql sas

1
推荐指数
2
解决办法
1万
查看次数

为什么不可变的新String("fish")!= new String("fish")?

我记得读过一篇可能在Bloch的Effective Java中的部分,它说大多数情况下,在哪里

String a = "fish";
String b = "fish";
Run Code Online (Sandbox Code Playgroud)

在大多数情况下,a == b因为字符串是不可变的.但是由于临时构造对象或其他一些东西,新的String("fish")会产生一个独特的对象引用.

我通过Bloch章节了解了equals(),不变性和对象创建,但是找不到这一点我记得!! 撕掉我的头发,有没有人记得这是什么原因的描述?它甚至可能不在EJ中,但我想找到它.提示:这解释的是我的实际问题.

java puzzle immutability effective-java

0
推荐指数
1
解决办法
295
查看次数