java - 如何序列化一个实现了 Serialized 但包含未实现 Serialized 的字段的对象?

标签 java serialization apache-commons

我使用的特定库是 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/

相关文章:

java - SQLite 无法通过 JDBC 和 jOOQ 在 SELECT 中找到现有列

java - 有谁知道如何从java中的记录中提取日期?

Django 模型 - 无法序列化为迁移文件

java - Apache Commons XMLConfiguration - 如何获取给定节点的对象列表?

java - Sonarqube 评估 - Ant Build 失败

java - 如何在java序列化中获取 transient 值

json - django:表单到 json

java - Apache Commons ObjectUtils equals 方法测试什么样的相等性?

java - 无法从 Servlet 执行 SSH

java - 通过 Firebase ML Kit 人脸检测检测多个人脸的轮廓