我使用的特定库是 Apache Commons CSV 库 v1.8(最新)。我正在尝试序列化包含 CSVRecord 的对象,但让我们看看它的代码:
public final class CSVRecord implements Serializable, Iterable<String> {
private static final String[] EMPTY_STRING_ARRAY = new String[0];
private static final long serialVersionUID = 1L;
private final long characterPosition;
private final String comment;
private final long recordNumber;
private final String[] values;
private final CSVParser parser;
它实现了可序列化
,但它包含一个不可序列化的 CSVParser:
public final class CSVParser implements Iterable<CSVRecord>, Closeable {
private final CSVFormat format;
private final Map<String, Integer> headerMap;
private final List<String> headerNames;
private final Lexer lexer;
private final CSVParser.CSVRecordIterator csvRecordIterator;
private final List<String> recordList;
private long recordNumber;
private final long characterOffset;
private final Token reusableToken;
是否有某种方法可以在不更改库的情况下解决此问题,使其成为 transient 字段?这只是作者的疏忽,还是有某种方法可以序列化我没有看到的 CSVRecord?
最佳答案
不错的收获! :) 我也检查了代码,发现没有办法在不接触库代码的情况下解决问题。但正如我所见,即使这样也存在问题。
我认为 CSVParser
不是 Serialized
的原因是它使文件保持打开状态,直到读取完成。如果允许序列化,那么就意味着在反序列化期间(可能在另一个系统上或者文件不再存在时)该对象仍然引用文件!
因此,即使您将库代码更改为从 CSVParser
中删除 final
并编写可序列化的子类或创建 parser
字段在 CSVRecord
中的 transient
,它仍然没有帮助,因为反序列化的类将不起作用,如上所述。
因此,我认为只有非类序列化方式可行(即 JSON 或 Map
等)。
关于java - 如何序列化一个实现了 Serialized 但包含未实现 Serialized 的字段的对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59900544/