我有以下课程:
import lombok.Data;
import java.io.Serializable;
@Data
public class Person implements Serializable {
private String age;
}
主要应用
import org.apache.commons.lang3.SerializationUtils;
public class MainApp {
public static void main(String[] args) {
Person v = new Person() {{
setAge("SD");
}};
Person person2 = SerializationUtils.clone(v);
}
}
测试类
import org.apache.commons.lang3.SerializationUtils;
import org.junit.Test;
public class TestClass {
@Test
public void test() {
Person v = new Person() {{
setAge("SD");
}};
Person person2 = SerializationUtils.clone(v);
}
}
在主应用程序中,序列化有效,而在单元测试中,序列化无效。 它引发带有以下详细信息的SerializationException: org.apache.commons.lang3.SerializationException:java.io.NotSerializableException:com.mypackage.TestClass
我正在使用intellij,该项目是maven项目,测试是JUnit4。依赖版本:
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>3.3.2</version>
</dependency>
请告知我该如何解决?
答案 0 :(得分:2)
您在测试中声明了一个匿名类。
非静态作用域中的匿名类(在实例方法,构造函数,实例初始值设定项或实例成员初始值设定项中)隐式包含对封闭类的引用(在这种情况下为TestClass
)。
由于该类不可序列化,因此无法序列化。
改为将您的匿名子类声明为静态类。
public class TestClass {
@Test
public void test() {
Person v = new TestPerson();
Person person2 = SerializationUtils.clone(v);
}
static class TestPerson extends Person {
{
setAge("SD");
}
}
}
或者更好的是,不要使用double-brace initialization,尤其是在您不了解它引起的与序列化有关的问题(以及其他问题)的情况下:
Person v = new Person();
v.setAge("SD");
Person person2 = SerializationUtils.clone(v);