gpt4 book ai didi

java - writeObject(this) 无法写入对象,java

转载 作者:行者123 更新时间:2023-12-01 17:12:01 27 4
gpt4 key购买 nike

我正在使用ObjectOutputStream保存对象,但是当我使用.writeObject(this)将其保存为文件时,无法保存 Material 。我定义的类已经是可序列化的。

public class LanguageModel implements Serializable {


private static LanguageModel lm_;

/* ******************************* */
//word -> count(w)
public static Dictionary unigramDict = new Dictionary();
//word_pair -> count(wi,wi+1)
public static Dictionary bigramDict = new Dictionary();

private static int wordIdCounter = 0;
/* ***************************** */


// Do not call constructor directly since this is a Singleton
private LanguageModel(String corpusFilePath) throws Exception {
constructDictionaries(corpusFilePath);
}


public void constructDictionaries(String corpusFilePath)
throws Exception {

...
}

// Saves the object (and all associated data) to disk
public void save() throws Exception{
FileOutputStream saveFile = new FileOutputStream(Config.languageModelFile);
ObjectOutputStream save = new ObjectOutputStream(saveFile);
save.writeObject(this);
save.close();
}

// Creates a new lm object from a corpus
public static LanguageModel create(String corpusFilePath) throws Exception {
if(lm_ == null ){
lm_ = new LanguageModel(corpusFilePath);
}
return lm_;
}

}

我定义的类如下:

import java.io.Serializable;

import java.util.HashMap;

public class Dictionary implements Serializable {

private int termCount;
private HashMap<String, Integer> map;

public int termCount() {
return termCount;
}

public Dictionary() {
termCount = 0;
map = new HashMap<String, Integer>();
}

...
}

当我尝试save.writeObject(unigramDict)时,它可以正确保存这个变量。由于它是一个很大的变量,我可以简单地检查文件的大小。是5MB。当我切换到 save.writeObject(this) 时,文件的大小只有 53 字节。

最佳答案

我认为您遇到了静态字段的问题,这些静态字段不能使用 save.writeObject(this) 保存。

来自ObjectOutputStream javadoc:

The default serialization mechanism for an object writes the class of the object, the class signature, and the values of all non-transient and non-static fields.

您只需将 unigramDictbigramDict 设置为非静态字段,并使用 LangugageModel.lm_.unigramDict 访问它即可。
也许你可以看看singleton pattern而不是将所有字段设置为静态

关于java - writeObject(this) 无法写入对象,java,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23272131/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com