Tag: 序列化

为什么在java中使用`transient`关键字?

我在java中的private修饰符之前有一个与transient关键字的使用相关的问题。 变量声明: transient private ResourceBundle pageResourceBundle; 当我用谷歌搜索它时,我在下面找到了这些文档,但它们正在谈论序列化。 实际上我的class级没有实现任何序列化。 欲了解更多信息: http://java91.blogspot.in/2017/01/why-does-java-have-transient-fields.html 我的class级看起来像这样: public class LoginViewModel extends AbstractViewModel { transient private ResourceBundle pageResourceBundle; @AfterCompose public void afterCompose(@ContextParam(ContextType.VIEW) Component view) { initializeLoginValues(); boolean timeout = BooleanUtils.toBoolean(getHttpServletRequest().getParameter(“timeout”)); if (timeout) { Messagebox.show(pageResourceBundle.getText(“MSG_SESSION_HAS_EXPIRED_PLEASE_LOGIN”), pageResourceBundle.getText(“LABEL_ALERT”), Messagebox.OK, Messagebox.ERROR); } view.getPage().setTitle(CsdcLicence.get().getApplicationName()); } 我有一些疑问。 1.为什么在私有变量之前使用transient关键字? 2.使用此关键字的目的是什么?

java.io.InvalidClassException:本地类不兼容:

我创建了客户端和服务器,然后在客户端添加了一个类用于序列化,然后只是转到我硬盘中客户端的文件夹并将其粘贴到服务器相应位置,分别是classname.class和classname.java 。 。 它在我自己的笔记本电脑上运行良好但是当我想继续我在其他系统上的工作时,当我打开项目文件夹并在客户端尝试连接到服务器后,出现以下错误: Exception in thread “main” java.io.InvalidClassException: projectname.clasname; local class incompatible: stream classdesc serialVersionUID = -6009442170907349114, local class serialVersionUID = 6529685098267757690 at java.io.ObjectStreamClass.initNonProxy(ObjectStreamClass.java:562) at java.io.ObjectInputStream.readNonProxyDesc(ObjectInputStream.java:1582) at java.io.ObjectInputStream.readClassDesc(ObjectInputStream.java:1495) at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1731) at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1328) at java.io.ObjectInputStream.readObject(ObjectInputStream.java:350) 到底是怎么回事? 是因为我使用较旧版本的IDE运行程序? 编辑 import java.io.Serializable; import java.net.URL; public class KeyAdr implements Serializable { private static final long serialVersionUID = 6529685098267757690L; […]

序列化JavaFX组件

我正在尝试在Java FX下开发一个小拖放应用程序。 用户将在某些位置删除按钮,菜单,标签等JFX组件。 完成后,他将保存此布局,稍后他将重新打开布局,他将再次使用它。 存储有关放在某个位置的所有对象的信息非常重要。 我决定为此目的使用序列化。 但是我无法序列化JavaFX组件。 我试图序列化按钮,场景,阶段,JFXPane但似乎没有任何工作(我获得了NotSerializableException)。 有关如何保存所有组件然后检索它们的任何建议? PS:我试图用FXML找出一些方法,但我没有成功。 非常感谢你的答案:)

序列化中readObject / writeObject的使用

我正在阅读本文以了解有关Java序列化过程的更多信息。 说到readObject/writeObject使用,我可以看到两个用例: 我们可以使用writeObject在序列化之前加密字节码。 从安全的角度来看,这是件好事。 我们可以使用readObject来执行需要在反序列化后立即执行的任何特定代码片段,当然从#1开始,我们甚至可以使用readObject来解密序列化对象时被截取的字节代码。 在编写自定义readObject / writeObject方法时序列化/反序列化对象时是否还有其他实际情况? 或者,如果你能指出我可以看到readObject / writeObject的一些体面和实际用途的任何地方?

如何在Gson中实现TypeAdapterFactory?

如何在Gson中实现TypeAdapterFactory类型? 创建的主要方法是通用的。 为什么? 注册方法registerTypeAdapterFactory()不接收类型参数。 那么, Gson如何知道工厂处理哪些类? 我应该为多个类实现一个工厂,还是可以为多个类实现一个工厂? 如果我为多个类实现一个工厂,那么在域外类型参数的情况下我应该返回什么?

使用Jackson将Json反序列化为另一个类层次结构

现在我和jackson合作,我对此有一些疑问。 首先。 我有两个服务,第一个是数据收集和发送服务,第二个接收这些数据,例如,将其记录到文件中。 所以,第一个服务有类层次结构,如下所示: +—-ConcreteC | Base —-+—-ConcreteA | +—-ConcreteB 第二个服务有类层次结构,如下所示: ConcreteAAdapter extends ConcreteA implements Adapter {} ConcreteBAdapter extends ConcreteB implements Adapter {} ConcreteCAdapter extends ConcreteC implements Adapter {} 第一个服务对ConcreteXAdapter一无所知。 我在第一个服务上发送数据的方式: Collection data = new LinkedBlockingQueue() JacksonUtils utils = new JacksonUtils(); data.add(new ConcreteA()); data.add(new ConcreteB()); data.add(new ConcreteC()); … send(utils.marshall(data)); … public class JacksonUtils { public […]

如何使用Java和Jackson Library对Json String进行多态反序列化?

我有一些类A,B,C它们都inheritance自BaseClass类。 我有一个String json,它包含A,B,C或BaseClass的json表示。 我想有一些方法将此String反序列化为BaseClass(多态反序列化)。 像这样的东西 BaseClass base = ObjectMapper.readValue(jsonString, BaseClass.class); jsonString可以是A,B,C或BaseClass中的任何一个的Json String表示。

无法反序列化lambda

就像一个小项目一样,我一直试图做一个小东西,读取序列化的lambdas(本地或从FTP)并调用它们的运行函数作为测试的一部分来试验Windows中的文件关联(即打开某些文件类型)用某个程序打开它们等等,但无论我尝试什么,它似乎都没有正确地反序列化。 lambda被宣布为这样 Runnable r = (Runnable & Serializable) () -> { // blah blah // made sure not to capture anything }; 并使用由ObjectOutputStream包装的[n optional] BufferedOutputStream包装的FileOutputStream进行序列化,没有问题。 但是,当[在不同的项目中]反序列化时,它会失败,说它无法找到包含序列化代码的封闭类。 我已经尝试了各种各样的东西,比如将它们包装在一个可序列化的类中(用于测试目的的w / serialVersionUID = 0L)或定义一个扩展Runnable和Serializable的接口,但无济于事。 是的,我知道序列化lambda不是很好的做法(或者我们被告知),但我不知道如何将函数和子程序转换成我可以存储为文件或FTP的东西。 如果这根本不是正确的方法,请告诉我们。 哦,我正在使用最新版本的Eclipse Luna。 编辑: 像这样反序列化 File f = new File(somePath); FileInputStream fish = new FileInputStream(f); BufferedInputStream bos = new BufferedInputStream(fish); // not really […]

Jackson JSON序列化,通过级别定义的递归避免

我使用Jackson库将我的pojo对象序列化为JSON表示。 例如,我有A类和B类: class A { private int id; private B b; constructors… getters and setters } class B { private int ind; private A a; constructors… getters and setters } 如果我想序列化来自A类的对象,则在序列化时有可能获得递归。 我知道我可以通过使用@JsonIgnore来阻止它。 是否可以按深度级别限制序列化? 例如,如果级别为2,则序列化将采用以下方式: 序列化a,level = 0(0 序列化 序列化ab,level = 1(1 序列化 序列化aba,level = 2(2 停止 提前致谢。

Kafka:编写自定义序列化程序

我正在尝试用Kafka 0.8.1建立一个POC。 我使用自己的java类作为Kafka消息,它有一堆String数据类型。 我不能使用默认的序列化程序类或Kafka库附带的String序列化程序类。 我想我需要编写自己的序列化程序并将其提供给生产者属性。 如果您知道在Kafka中编写示例自定义序列化程序(在java中),请分享。 非常感谢,非常感谢。