将字段标记为瞬态如何使序列化对象成为可能 - java

public class Foo implements java.io.Serializable {
   private int v1;
   private static double v2;
   private Loan v3 = new Loan();
}

选项:
答:因为Foo实现了Serializable,所以可以序列化Foo的实例。
B. Foo的实例无法序列化,因为Foo包含不可序列化的实例变量v3。
C.如果将v3标记为瞬态,则Foo的实例是可序列化的。
D.b和c

答案:D

说明:即使对象的类实现了java.io.Serializable,也可能无法序列化该对象,因为它可能包含不可序列化的实例变量。

现在我的问题是:

据我所知,transient是used以关闭序列化。那么在这种情况下瞬态如何帮助我们序列化foo?

参考方案

transient不会完全禁用序列化;它只是标记不会序列化的成员。它通常用于在对象未序列化时不正确或无关紧要的东西,或存储起来不太安全的东西(密码,解密的数据之类的东西),或可能导致无法序列化的东西。容易重建。

在这种情况下,我假设Loan类不可序列化。 (如果是,那么A将是正确的。)将v3标记为transient只是告诉Java不必担心该字段,而是继续序列化其他字段。这意味着未序列化的Foo可能具有空v3。如果您还想存储Loan,则需要跟踪足够的信息以随意重新创建它,或者需要更改Loan类以使其也实现java.io.Serializable

另外,如果需要控制序列化,则可以实现一些方法(writeObjectreadObject)。但这可能有点麻烦。

Java:BigInteger,如何通过OutputStream编写它 - java

我想将BigInteger写入文件。做这个的最好方式是什么。当然,我想从输入流中读取(使用程序,而不是人工)。我必须使用ObjectOutputStream还是有更好的方法?目的是使用尽可能少的字节。谢谢马丁 参考方案 Java序列化(ObjectOutputStream / ObjectInputStream)是将对象序列化为八位字节序列的一种通用方法。但…

Java:线程池如何将线程映射到可运行对象 - java

试图绕过Java并发问题,并且很难理解线程池,线程以及它们正在执行的可运行“任务”之间的关系。如果我创建一个有10个线程的线程池,那么我是否必须将相同的任务传递给池中的每个线程,或者池化的线程实际上只是与任务无关的“工人无人机”可用于执行任何任务?无论哪种方式,Executor / ExecutorService如何将正确的任务分配给正确的线程? 参考方案 …

JAVA:字节码和二进制有什么区别? - java

java字节代码(已编译的语言,也称为目标代码)与机器代码(当前计算机的本机代码)之间有什么区别?我读过一些书,他们将字节码称为二进制指令,但我不知道为什么。 参考方案 字节码是独立于平台的,在Windows中运行的编译器编译的字节码仍将在linux / unix / mac中运行。机器代码是特定于平台的,如果在Windows x86中编译,则它将仅在Win…

java:继承 - java

有哪些替代继承的方法? java大神给出的解决方案 有效的Java:偏重于继承而不是继承。 (这实际上也来自“四人帮”)。他提出的理由是,如果扩展类未明确设计为继承,则继承会引起很多不正常的副作用。例如,对super.someMethod()的任何调用都可以引导您通过未知代码的意外路径。取而代之的是,持有对本来应该扩展的类的引用,然后委托给它。这是与Eric…

Java DefaultSslContextFactory密钥库动态更新 - java

我有一个使用org.restlet.engine.ssl.DefaultSslContextFactory的现有应用程序和一个在服务器启动时加载的密钥库文件。我有另一个应用程序,该应用程序创建必须添加的证书服务器运行时动态地更新到密钥库文件。为此,我在代码中创建了证书和私钥,然后将其写入到目录。该目录由bash脚本监视,该脚本检查是否有新文件,如果出现,它将…