Java 序列化还是不序列化

Java 序列化还是不序列化,java,serialization,Java,Serialization,我有一个小型桌面应用程序,需要为单个用户保留一些简单但结构化的数据>10K。我想谈谈我是应该序列化对象还是构建一些XML数据文件。我开始将事情序列化为简单化,这是可行的,但我想我也应该向社区征求一些反馈意见。是否有我可能遗漏的缺点或潜在问题?XML是序列化的众多选择之一。您可以使用Java Serializable、XML、JSON、protobuf或任何您想要的东西。我看不出有什么陷阱 XML的一个优点是可以使用JAXB封送和解封送对象 XML是序列化的众多选择之一。您可以使用Java Ser

我有一个小型桌面应用程序,需要为单个用户保留一些简单但结构化的数据>10K。我想谈谈我是应该序列化对象还是构建一些XML数据文件。我开始将事情序列化为简单化,这是可行的,但我想我也应该向社区征求一些反馈意见。是否有我可能遗漏的缺点或潜在问题?

XML是序列化的众多选择之一。您可以使用Java Serializable、XML、JSON、protobuf或任何您想要的东西。我看不出有什么陷阱


XML的一个优点是可以使用JAXB封送和解封送对象

XML是序列化的众多选择之一。您可以使用Java Serializable、XML、JSON、protobuf或任何您想要的东西。我看不出有什么陷阱


XML的一个优点是可以使用JAXB封送和解封送对象

我更喜欢用XML文件来存储数据,因为加载和保存系统是您自己实现的。如果更改对象的结构(例如adding和Integer),这不会影响所用数据的行为,那么通过序列化保存的所有旧对象都是无用的,因为它们不再适合您的类。但是使用自行设计的XML存储系统,您仍然可以从旧保存的数据创建对象。

我更喜欢使用XML文件来存储数据,因为加载和保存系统是您自己实现的。如果更改对象的结构(例如adding和Integer),这不会影响所用数据的行为,那么通过序列化保存的所有旧对象都是无用的,因为它们不再适合您的类。但是使用自行设计的XML存储系统,您仍然可以从旧保存的数据创建对象。

使用Java序列化机制的一个主要缺点是它与Java类紧密耦合。如果您在应用程序的新版本中更改了Java类,例如添加或删除了成员变量,那么您将无法读取使用旧版本编写的文件。由于这个原因,序列化对于长期存储来说并不太好


Java序列化数据的格式是非标准格式,这意味着使用非Java工具很难处理数据。

使用Java序列化机制的一个主要缺点是它与Java类紧密耦合。如果您在应用程序的新版本中更改了Java类,例如添加或删除了成员变量,那么您将无法读取使用旧版本编写的文件。由于这个原因,序列化对于长期存储来说并不太好

Java序列化数据的格式是非标准格式,这意味着使用非Java工具很难处理数据。

最好的选择是使用基于文件的数据库。我试过的一个是HSQLDB,它完全基于java

您可以将它与JDBC一起使用&有权使用SQLs

您不需要任何数据库安装,它只需要一个jar文件即可&它可以用您的数据创建单独的文件

例如:

注意:序列化不适用于持久性。如果您的类发生了变化,那么反序列化将非常困难&这与数据丢失一样糟糕。

最好的选择是使用基于文件的数据库。我试过的一个是HSQLDB,它完全基于java

您可以将它与JDBC一起使用&有权使用SQLs

您不需要任何数据库安装,它只需要一个jar文件即可&它可以用您的数据创建单独的文件

例如:


注意:序列化不适用于持久性。如果您的类发生了变化,那么反序列化将非常困难&这将与数据丢失一样好。

听起来您对权衡有很好的理解。序列化更容易,但不像XML那样可扩展。如果这是一个学校项目或应用程序供你自己使用,我个人会选择序列化

您还应该考虑用户是否能够阅读/编辑XML。您可能需要采取措施来防止这种情况


您应该看看xStream。我已经在几个项目中使用过它。

听起来您对权衡有很好的理解。序列化更容易,但不像XML那样可扩展。如果这是一个学校项目或应用程序供你自己使用,我个人会选择序列化

您还应该考虑用户是否能够阅读/编辑XML。您可能需要采取措施来防止这种情况


您应该看看xStream。我已经在几个项目中使用过它。

第三种选择是使用JSON,通过Jackson解析器快速反序列化到Java对象。

第三种选择是使用JSON,使用Jackson解析器可以快速反序列化到Java对象或从Java对象序列化。

我担心这是一个完美的例子,可以解决这个问题

对象的简单序列化并将其保存为二进制数据会使您的应用程序容易受到这些类实现更改的影响。一旦修改它们,您可能很难正确加载旧数据。我会选择XML。它是可读的,它是一种通用格式,它为您提供了很大的灵活性。如果您注意在DTD或XML模式中定义格式,那么编程开销也很小。像JAXB这样的框架将为您完成大部分工作。谢谢。我开始想知道适度使用和可扩展性问题,但还没有具体碰到。这感觉不太对。我担心这是一个完美的例子,可以回答一个即将结束的问题。发布后我也这么想。简单的对象序列化并将其保存为二进制数据会使您的应用程序容易受到这些类实现更改的影响。一旦修改它们,您可能很难正确加载旧数据。我会选择XML。它是可读的,它是一种通用格式,它为您提供了很大的灵活性。如果您注意在DTD或XML模式中定义格式,那么编程开销也很小。像JAXB这样的框架将为您完成大部分工作。谢谢。我开始想知道适度使用和可扩展性问题,但还没有具体碰到。只是感觉不对。序列化不利于持久性。为什么不呢?对于这个有限的用例来说,听起来不错。比数据库更简单。好吧,如果您在持久化的类中进行更改,反序列化将是一团混乱。这行不通。序列化适用于传输对象,如RMI等。在这里,序列化传输-反序列化&就完成了。但是长期存储是不可靠的。@RaviK-您对序列化问题的描述过于简单。请再阅读我的回答。Java serializable只是一种选择。您当然可以使用XML和JSON进行duck类型化。你根本不知道用户的类是静态的还是动态的。做一件最简单的事情,这可能适用于这里。序列化不利于持久性。为什么不呢?对于这个有限的用例来说,听起来不错。比数据库更简单。好吧,如果您在持久化的类中进行更改,反序列化将是一团混乱。这行不通。序列化适用于传输对象,如RMI等。在这里,序列化传输-反序列化&就完成了。但是长期存储是不可靠的。@RaviK-您对序列化问题的描述过于简单。请再阅读我的回答。Java serializable只是一种选择。您当然可以使用XML和JSON进行duck类型化。你根本不知道用户的类是静态的还是动态的。做最简单的事情,可能会适用于这里。您对序列化缺点的描述有点简单化。随着时间的推移,您可以处理类的演化,但这一点也不简单。您对序列化缺点的描述有点过于简单。随着时间的推移,您可以处理类的演化,但这绝非易事。