我正在尝试序列化这个Configuration对象,但对于我的生活,我无法得到它。我已经检查过包括StackOverflow在内的所有地方。任何帮助将不胜感激。
序列化代码:
public void serialize(String outFile)
throws IOException {
Configuration config = new Configuration().getConfiguration();
System.out.println(config.email);
try
{
FileOutputStream outputFile =
new FileOutputStream("/home/jason/Desktop/config.ser");
ObjectOutputStream objectOutput = new ObjectOutputStream(outputFile);
objectOutput.writeObject(config);
objectOutput.close();
outputFile.close();
}catch(IOException i)
{
i.printStackTrace();
}
System.out.println(config);
}
public void deSerialize()
throws FileNotFoundException, IOException, ClassNotFoundException {
Configuration config = new Configuration().getConfiguration();
try
{
FileInputStream inputFile = new FileInputStream("/home/jason/Desktop/config.ser");
ObjectInputStream objectInput = new ObjectInputStream(inputFile);
config = (Configuration) objectInput.readObject();
config.setConfiguration(config);
objectInput.close();
inputFile.close();
}catch(Exception e)
{
e.printStackTrace();
}
System.out.println(config);
}
然后我用以下代码调用它:
DataStore data = new DataStore().getInstance();
try {
data.deSerialize();
} catch (ClassNotFoundException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
DataStore是一个简单的单例,不带任何输入参数。它没有任何实际变量,只是使用序列化函数。
最后,这是我的配置代码:
public class Configuration implements Serializable{
private static final long serialVersionUID = 1388190376766023647L;
public static String email = "";
private static String ip = "";
private static String password = "";
private static String importNumber;
private static Configuration configuration;
private static int singleton = 0;
public String value_of_da_message;
public Configuration()
{}
public Configuration getConfiguration()
{
if(singleton == 0){
configuration = new Configuration();
singleton++;
return configuration;
}
else
return configuration;
}
public void setConfiguration(Configuration config)
{
configuration = config;
}
关于我哪里出错的任何线索?谢谢你的帮助。
答案 0 :(得分:2)
看看这里:Java static serialization rules?
将您的字段更改为实例字段,这样无论如何都更适合单例方法。
字段可能是序列化的,但反序列化通常会忽略静态字段。
此外,您似乎正在阅读临时对象:
config.setConfiguration(config);
这使用了两次读取对象并且没有设置单例的数据,除非你保持静态字段(即configuration
类中的Configuration
是对单例的引用并且需要是静态的)
<强>更新强>:
另一个提示:静态变量singleton
可能会导致问题而且无论如何都是不需要的。只需检查configuration == null
而不是singleton == 0
。
<强>提示强>:
我尝试一般性地帮助您进行序列化,但在您的特殊情况下,您可能希望使用Properties
而不是具有内置序列化功能(支持.properties-和xml文件),这意味着用于配置。