socket传输中,java的对象序列化和反序列化过程中是如何确保数据的完整性的

就是想知道下ObjectInputStream和ObjectOutptStream的读取机制

·ObjectInputStream和ObjectOutputStream这两个包装类,用于从底层输入流中读取对象类型的数据和对象类型的数据写入到底层输出流。将对象中所有成员变量的取值保存起来就等于保存了对象,将对象中所有成员变量的取值还原就相等于读取了对象。
·ObjectInputStream和ObjectOutputStream类所读写的对象必须实现了Serializable接口。对象中的transient(一种标记,表示变量是临时的)和static类型的成员变量不会被读取和写入。这两个类可以用于网络流中传送对象。
( transient:java语言的关键字,变量修饰符,如果用transient声明一个实例变量,当对象存储时,它的值不需要维持。
  Java的serialization提供了一种持久化对象实例的机制。当持久化对象时,可能有一个特殊的对象数据成员,我们不想用 serialization机制来保存它。为了在一个特定对象的一个域上关闭serialization,可以在这个域前加上关键字transient。当一个对象被串行化的时候,transient型变量的值不包括在串行化的表示中,然而非transient型的变量是被包括进去的。)
·一个可以被序列化的MyClass类的定义:
public class MyClass implements Serializable{
public transient Thread t; //t不会被序列化
private String customerID;
private int total;
}
·编程举例:创建一个可序列化的学生对象,并用ObjectOutputStream类把它存储到一个文件(mytext.txt)中,然后再用ObjectInputStream类把存储的数据读取到一个学生对象中,即恢复保存的学生对象。

[java] view plaincopy
import java.io.*;

class Student implements Serializable //必须实现Serializable接口才能序列化
{
int age;
String name;
Student(int age, String name){
this.age = age;
this.name = name;
}
}
public class Iotest {

/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
Student stu1 = new Student(20,"zhangsan");
Student stu2 = new Student(22,"lisi");
try {
FileOutputStream fos = new FileOutputStream("a.txt");
ObjectOutputStream oos = new ObjectOutputStream(fos);
oos.writeObject(stu1);
oos.writeObject(stu2);
oos.close();

FileInputStream fis = new FileInputStream("a.txt");
ObjectInputStream ois = new ObjectInputStream(fis);
Student stu3 = (Student) ois.readObject();
System.out.println("age: "+stu3.age);
System.out.println("name: "+stu3.name);

} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}

}

}
温馨提示:内容为网友见解,仅供参考
无其他回答

socket传输中,java的对象序列化和反序列化过程中是如何确保数据的完整...
public transient Thread t; \/\/t不会被序列化 private String customerID;private int total;} ·编程举例:创建一个可序列化的学生对象,并用ObjectOutputStream类把它存储到一个文件(mytext.txt)中,然后再用ObjectInputStream类把存储的数据读取到一个学生对象中,即恢复保存的学生对象。[java] vi...

【Java原理系列】 Java可序列化接口Serializable原理全面用法示例源码分 ...
加密和验证示例:在进行网络传输或持久化存储时,可以使用加密算法对序列化的数据进行加密,或使用数字签名来验证数据的完整性。自定义序列化行为示例:如果需要对对象的状态进行特殊处理,或以不同于默认机制的方式序列化对象的字段,可以通过覆写writeObject方法来控制序列化过程。使用Externalizable接口的示例:...

不会现在还有人不知道如何解决js精度缺失问题吧!
1. **代码实操**:在对象映射器中,使用基于jackson库实现的序列化和反序列化功能。序列化是将Java对象转换为JSON字符串的过程,而反序列化则是将JSON字符串转换回Java对象的过程。这有助于在前后端之间传输数据时保持数据完整性。2. **结果截图**:在项目中实现上述序列化和反序列化操作后,重启项...

...序列化器的序列化、序列化器的反序化、 模型类序列化器
3. **定义字段**:在序列化器类内部,可以自定义字段,以控制序列化过程。例如,可以添加只读字段、只写字段或自定义验证逻辑。4. **序列化与反序列化**:序列化器提供了`serialize()`方法用于序列化对象,以及`create()`和`update()`方法用于反序列化并创建或更新对象。5. **集成与使用**:将...

Java中解决安全问题的技术有哪些?
不要依赖初始化 不要通过名称来比较类 不要使用内部类 不要依赖初始化您可以不运行构造器而分配对象。这些对象使用起来不安全,因为它们不是通过构造器初始化的。影响在初始化时验证对象确保了数据的完整性。例如,请想象为客户创建新帐户的 Account 对象。只有在 Account 期初余额大于 0 时,才可以开设新帐户。可以在...

序列化的作用是什么呀·
序列化的过程可以分为两个主要步骤:首先进行序列化,将对象的状态转换为可以被保存或发送的格式;其次,当需要时,再进行反序列化,将这些数据重新转换回原始对象,恢复其完整的状态。这种技术在软件开发中至关重要,它使得程序能够持久化数据,支持分布式系统间的通信,以及在需要时加载和复用对象,提高了...

服务器通信协议设计 Protobuf
序列化是协议设计的关键环节,它解决了直接使用结构体进行通信的局限性。结构体不能适应不同的环境和语言,因此需要将数据转换为可跨平台传输的格式,包括序列化和反序列化的过程。为了保证消息的完整性,协议设计需要明确包的边界,常见的方法包括特定的包头标识。例如,IM即时通讯和云平台节点服务器的协议...

什么是序列化
问题五:在JAVA中什么叫序列化和反序列化 30分 序列化是将对象状态转换为可保持或传输的格式的过程。与序列化相对的是反序列化,它将流转换为对象。这两个过程结合起来,可以轻松地存储和传输数据。 问题六:php 什么是序列化 string serialize ( mixed value ) serialize() 返回字符串,此字符串包含了表示 value...

ue4 网络模块学习
网络同步的核心在于Actor属性的同步。Actor同步流程首先在服务端进行序列化,主要涉及从Actor实例生成网络GUID,序列化Actor属性和其外部对象的标识信息。客户端接收到数据后,反序列化过程开始。在服务端和客户端,序列化和反序列化过程共同确保了Actor属性的一致性。Replication Graph提供了Lua语言接口用于定义...

tcp传输连接中的syn、ack、seq、an分别是什么意思?他们所带..._百度...
这样确保了数据的连续性和完整性。通过这些机制,TCP协议实现了可靠的数据传输服务。综上所述 ,TCP的SYN用于连接建立 ACK确认接收序列化和持续发送用以可靠数据传输 的辅助确认 以及对应的序列号\/确认号为通信的两端 提供可完整保障 信息连贯无误的逻辑反馈 ,以保障通信的有序进行 。

相似回答