junit测试上的SerializationException

时间:2018-10-23 06:58:48

标签: java apache serialization junit

我有以下课程:

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>

请告知我该如何解决?

1 个答案:

答案 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);