【问题标题】:Can't Serialize My Object无法序列化我的对象
【发布时间】:2014-06-04 04:31:05
【问题描述】:

我正在尝试序列化此 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;
}

关于我哪里出错的任何线索?感谢您的帮助。

【问题讨论】:

  • 可能是一个愚蠢的问题,但必须问,因为你还没有展示它:你确实实现了Serializable 接口,不是吗?
  • 哦,很好。但是是的,我已经实现了。
  • "无法序列化我的对象" 当您尝试时会发生什么?您是否看到任何异常/错误?您也没有向我们展示您是如何声明Configuration 类的。
  • 不。没有错误或异常。简单地忽略我的序列化。我已经测试过它是否正确序列化,并且确实如此。所以我认为问题出在反序列化或配置期间。我会补充一点!编辑:添加它
  • 我不应该序列化配置吗?

标签: java serialization


【解决方案1】:

看看这里:Java static serialization rules?

将您的字段更改为实例字段,无论如何这将更适合单例方法。

字段可能会被序列化,但反序列化通常会忽略静态字段。

此外,您似乎正在阅读临时对象:

config.setConfiguration(config);

这使用了两次读取对象并且不会设置单例的数据,除非您保留该静态字段(即Configuration 类中的configuration 是对单例的引用,并且需要是静态的)

更新

另一个提示:静态变量singleton 可能会导致问题并且无论如何都不需要。只需检查configuration == null 而不是singleton == 0

提示

我一般会尝试帮助您进行序列化,但在您的特殊情况下,您可能希望使用 Properties 来代替它具有内置序列化功能(支持 .properties 和 xml 文件)并且用于配置.

【讨论】:

  • 好的,所以我现在有点困惑。除了单例之外,我已经对所有内容进行了非静态化,但仍然没有。然后我尝试重新静态化除配置之外的所有内容,但仍然没有。
  • 是的。我找不到任何错误。另外,没有错误或警告。
  • @user3010468 那么在反序列化后读取的对象具有正确的值,但它们在另一个地方是不同的?还是反序列化了错误的值?代码更改后是否再次序列化?
  • 好的,所以我将我的电子邮件字符串设置为公开来测试这一切。在序列化之前,config.email 是正确的。序列化后,config.email 是正确的。在反序列化期间,调用 config.setConfiguration() 之后的 config.email 为空白。如果我在调用 setter 后立即从 config.getConfiguration().email 调用它也是一样的。
  • @user3010468 很高兴你让它工作了。最后一点:正如我之前所说,您实际上并不需要 singleton 变量。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-04-25
  • 1970-01-01
  • 1970-01-01
  • 2014-08-04
  • 2015-05-29
相关资源
最近更新 更多