java 序列化 Serializable

本文详细阐述了对象序列化与反序列化的概念,通过代码实例展示了如何将Java对象转换为字节序列,并从字节序列恢复对象。重点分析了序列化过程中的Serializable接口和ObjectOutputStream的使用方法,以及反序列化过程中可能出现的问题和解决策略。
把对象转换为字节序列的过程称为对象的[b]序列化[/b]。
把字节序列恢复为对象的过程称为对象的[b]反序列化[/b]。
序列化(又叫串行化)就是一种用来处理对象流的机制,所谓对象流也就是将对象的内容进行流化。可以对流化后的对象进行读写操作,也可将流化后的对象传输于网络之间。序列化是为了解决在对对象流进行读写操作时所引发的问题。
序列化的实现:将需要被序列化的类实现Serializable接口,该接口没有需要实现的方法,implements Serializable只是为了标注该对象是可被序列化的,然后使用一个输出流(如:FileOutputStream)来构造一个 ObjectOutputStream(对象流)对象,接着,使用ObjectOutputStream对象的writeObject(Object obj)方法就可以将参数为obj的对象写出(即保存其状态),要恢复的话则用输入流。

简单来说 序列化就是把Java对象储存在某一地方(硬盘、网络),以便于传输 (知道)
一个小例子


import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;

public class TestTransient {

private static ObjectInputStream ois;

/**
* @param args
* @throws IOException
* @throws FileNotFoundException
* @throws ClassNotFoundException
*/
public static void main(String[] args) throws FileNotFoundException,
IOException, ClassNotFoundException {
A a = new A(25, "张三");
System.out.println(a);
ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(
"d://mm.txt"));
oos.writeObject(a);
oos.close();
ois = new ObjectInputStream(new FileInputStream("d://mm.txt"));
a = (A) ois.readObject();
System.out.println(a);

}

}

class A implements Serializable {
/**
*
*/
private static final long serialVersionUID = 1L;
int a;
//transien修饰符 反序列化变量b;
transient String b;

public A(int a, String b) {
this.a = a;
this.b = b;
}

public String toString() {
return "a = " + a + ",b = " + b;
}
}

运行结果如下:

a = 25,b = 张三
a = 25,b = null

在上面的例子中,我将属性b前添加关键字transient,我们看到虽然我们序列化的对象a的属性值为“张三”,但是当我们反序列化之后发现这个属性为空,说明这个属性没有进行序列化。(以上内容整理于网络)
参考:http://www.cnblogs.com/xdp-gacl/p/3777987.html
本课题设计了一种利用Matlab平台开发的植物叶片健康状态识别方案,重点融合了色彩与纹理双重特征以实现对叶片病害的自动化判别。该系统构建了直观的图形操作界面,便于用户提交叶片影像并快速获得分析结论。Matlab作为具备高效数值计算与数据处理能力的工具,在图像分析与模式分类领域应用广泛,本项目正是借助其功能解决农业病害监测的实际问题。 在色彩特征分析方面,叶片影像的颜色分布常与其生理状态密切相关。通常,健康的叶片呈现绿色,而出现黄化、褐变等异常色彩往往指示病害或虫害的发生。Matlab提供了一系列图像处理函数,例如可通过色彩间转换与直方图统计来量化颜色属性。通过计算各颜色通道的统计参数(如均值、标准差及主成分等),能够提取具有判别力的色彩特征,从而为不同病害类别的区分提供依据。 纹理特征则用于描述叶片表面的微观结构与形态变化,如病斑、皱缩或裂纹等。Matlab中的灰度共生矩阵计算函数可用于提取对比度、均匀性、相关性等纹理指标。此外,局部二值模式与Gabor滤波等方法也能从多尺度刻画纹理细节,进一步增强病害识别的鲁棒性。 系统的人机交互界面基于Matlab的图形用户界面开发环境实现。用户可通过该界面上传待检图像,系统将自动执行图像预处理、特征抽取与分类判断。采用的分类模型包括支持向量机、决策树等机器学习方法,通过对已标注样本的训练,模型能够依据新图像的特征向量预测其所属的病害类别。 此类课题设计有助于深化对Matlab编程、图像处理技术与模式识别原理的理解。通过完整实现从特征提取到分类决策的流程,学生能够将理论知识与实际应用相结合,提升解决复杂工程问题的能力。总体而言,该叶片病害检测系统涵盖了图像分析、特征融合、分类算法及界面开发等多个技术环节,为学习与掌握基于Matlab的智能检测技术提供了综合性实践案例。 资源来源于网络分享,仅用于学习交流使用,请勿用于商业,如有侵权请联系我删除!
### Java序列化概念 在Java中,对象的序列化是指把对象转换成字节流的过程,以便于保存到文件或在网络上传输。反序列化则是指将这些字节流转回原始对象的过程。为了使某个类的对象能够被序列化,该类需要实现`java.io.Serializable`接口。 此接口并不提供具体的方法;它只是一个标记接口,表明实现了它的类可以参与序列化进程[^1]。当一个类未实现`Serializable`接口而试图对其进行序列化操作时,将会抛出`NotSerializableException`异常[^2]。 ### Serializable 接口使用方法 为了让一个自定义类支持序列化功能,只需让此类继承`Serializable`接口即可: ```java import java.io.*; class Person implements Serializable { private static final long serialVersionUID = 1L; String name; transient int age; // 不希望age属性被序列化 public Person(String n, int a){ this.name=n; this.age=a; } } ``` 注意,在上述例子中加入了`transient`关键字修饰成员变量`age`,这意味着即使整个类是可序列化的,但是`age`字段不会参与到序列化过程中去。另外还声明了一个名为`serialVersionUID`的静态常量来确保不同版本之间的兼容性。 对于如何实际执行序列化和反序列化过程,则可以通过如下方式完成: #### 序列化对象至文件 ```java public class SerializeDemo { public static void main(String[] args) { Person p = new Person("John", 30); try{ FileOutputStream fileOut = new FileOutputStream("/tmp/person.ser"); ObjectOutputStream out = new ObjectOutputStream(fileOut); out.writeObject(p); out.close(); fileOut.close(); System.out.printf("Serialized data is saved in /tmp/person.ser"); }catch(IOException i){ i.printStackTrace(); } } } ``` #### 从文件读取并恢复对象 ```java public class DeserializeDemo { public static void main(String[] args) { Person p = null; try{ FileInputStream fileIn = new FileInputStream("/tmp/person.ser"); ObjectInputStream in = new ObjectInputStream(fileIn); p = (Person)in.readObject(); in.close(); fileIn.close(); } catch(Exception e){ e.printStackTrace(); return; } System.out.println("Deserialized Person..."); System.out.println("Name: " + p.name); System.out.println("Age: " + p.age); // 这里打印出来的年龄将是默认值0,因为它是瞬态(transient)的 } } ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值