gpt4 book ai didi

java - 在Java中序列化自定义类型

转载 作者:行者123 更新时间:2023-11-30 07:24:58 25 4
gpt4 key购买 nike

我在阅读一些关于Java序列化的资料,发现对于自定义类型,我们可以在类型中定义两个成员函数来改变默认的序列化行为:

private void readObject(java.io.ObjectInputStream in)
private void writeObject(java.io.ObjectOutputStream out)

我有两个问题:
1、这两个函数都是用private关键字限定的,在序列化过程中是如何调用的?
2、我们都知道Java的Serializable接口(interface)是一个空接口(interface),那么序列化机制是如何知道调用这两个函数进行序列化和反序列化的呢?

期待您的帮助!

最佳答案

These two functions are all qualified with private keyword, how are they called during the serializing process?

基本上,Java 序列化涉及 JVM 中的魔法。哎呀,它甚至可以涉及在不调用构造函数的情况下创建对象。

We all know that Java Serializable Interface is an empty interface, so how does the serializing mechanism knows to call these two function to serialize and deserialize?

通过反射很容易判断(从适当可信的代码)一个类是否提供了某些方法。序列化框架代码足够可信,可以确定这一点并调用这些方法。

当然,在普通 Java 中,仅检测和调用另一个类的私有(private)方法是可行的(同样,使用适当可信的代码):

import java.lang.reflect.*;

class Other {
private static void privateMethod() {
System.out.println("You can't call me, can you?");
}
}

public class Test {
public static void main (String[] args) throws Exception {
Method method = Other.class.getDeclaredMethod("privateMethod");
method.setAccessible(true);
method.invoke(null);
}
}

关于java - 在Java中序列化自定义类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11184156/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com