`
thaIm
  • 浏览: 91766 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

Java Serialize

阅读更多
一) 何为序列化(Serialize)
    将Java 对象序列化为二进制文件的技术称为序列化。

二)何时需要使用到序列化技术
    大致三种情况吧:
    a)当你想把的内存中的对象写入到硬盘的时候;
    b)当你想用套接字在网络上传送对象的时候;
    c)当你想通过RMI传输对象的时候;

三)Hello, Serialize
    话不多说,给个简单例子:
   
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 SerializeClass implements Serializable {
	private static final long serialVersionUID = 1L;
	private String name = "thaIm";
	private transient String ignoreStr = "ignore";
	public static int staticVar = 5;
	
	public static void main(String[] args) {
		try{
	        ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream("result.obj"));
			out.writeObject(new SerializeClass());
			out.close();
			
			SerializeClass.staticVar = 10;
			
			ObjectInputStream oin = new ObjectInputStream(new FileInputStream("result.obj"));
			SerializeClass sc = (SerializeClass) oin.readObject();
			oin.close();
			
			System.out.println(sc.getName()+"=="+sc.getIgnoreStr()+"=="+SerializeClass.staticVar);
	    } catch (FileNotFoundException e) {
	    	e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		} catch (ClassNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
	public String getName()
	{
	return name;
	}
	public void setName(String name)
	{
	this.name = name;
	}
	public void setIgnoreStr(String ignoreStr) {
		this.ignoreStr = ignoreStr;
	}
	public String getIgnoreStr() {
		return ignoreStr;
	}
}


程序的输出结果: thaIm==null==10
和你想的一样么?

四)serialVersionUID
    如果你第一次接触java序列化,可能会对以上代码中的serialVersionUID字段很好奇。这看似多余的东西到底有何用途呢?且听我娓娓道来~~
   情境:两个客户端 A 和 B 试图通过网络传递对象数据,A 端将对象 C 序列化为二进制数据再传给 B,B 反序列化得到 C。
   实现条件: A B 两个客户端SerializeClass类有相同的:1)类路径 2)功能代码 3)序列化ID,即serialVersionUID
   而之所以要增加序列化ID一致这个条件,是因为它的存在对于代码的版本控制,代码安全都有不小的好处。

五)多说几句
    1)关键字transient,它可使字段避免被序列化,反序列化时该字段取默认值(比如String的话就为null,int的话为0) 上述例子中 private transient String ignoreStr = "ignore";说明了该情况。
    2)static 字段不会被序列化。原因也很简单,它是类的变量,不是某个实例的变量。注意上述例子中的语句 SerializeClass.staticVar = 10;
    3)序列化存储规则。 对同一对象两次序列化入文件,第二次的序列化将只新增引用信息,以引用第一次序列化的对象。这样做不但可以保证反序列化后两个对象==,而且还能节省不少磁盘空间。是个非常不错的序列化规则哦!
分享到:
评论

相关推荐

    addison-common-cached:jedis操作,支持读写分离,支持HessianSerialize、Hessian2Serialize、JavaSerialize等序列化

    "addison-common-cached"项目就是针对这一需求提供的一种解决方案,它基于Jedis实现,并且支持读写分离以及多种序列化方式,如HessianSerialize、Hessian2Serialize和JavaSerialize。下面将详细阐述这些知识点。 ...

    Serialize and Deserialize Java 示例程序

    Serialize and Deserialize Java 示例程序。简单来讲,它的数据格式与json类似,但是在存储时对数字、多字节字符、数组等都做了很多优化,减少了无用的字符,二进制格式,也保证不用字符化带来额外的存储空间的增加...

    Jquery serialize() 中文乱码及解决方法

    Jquery serialize() 中文乱码及解决方法 Jquery serialize() 方法在处理中文数据时,经常会出现乱码问题。这种问题的原因是 serialize() 方法自动调用了 encodeURIComponent 方法将数据编码了,从而导致中文乱码。...

    PHPSerializer.java

    php的serialize/unserialize,方便把一个数组序列化和反序列化,但是要和java交互,就比较麻烦了。通过这个工具类可实现很好的php与java的交互。 博客地址:...

    java 序列化成PHP格式。

    将java数据 序列化成PHP的格式 a:4:{s:6:"title2";s:13:"这是标题2";s:6:"title3";s:13:"这是标题3";s:5:"title";s:13:"这是标题1";s:6:"title4";s:13:"这是标题4";} 或者a:1:{i:0;a:1:{s:4:"name";s:10:"这是1321";...

    Core Java Volume II Advanced Features__10th edition

    •Efficiently access files and directories, read/write binary or text data, and serialize objects •Work with Java SE 8’s regular expression package •Make the most of XML in Java: parsing, ...

    json与java对象互转

    public JsonElement serialize(java.sql.Date src, Type typeOfSrc, JsonSerializationContext context) { return new JsonPrimitive(src.getTime()); } } public class UtilDateSerializer implements ...

    java关键字总结文档

    void serialize(); } ``` #### 10. 访问修饰符 - **用途**:控制对类、方法和变量的访问级别。 - `private`:仅限于当前类内部访问。 - `protected`:允许同包内或子类访问。 - `public`:完全公开,允许任何...

    serialize binary tree.pdf

    ```java class Node { Object element_; Node[] children_; public Node(Object element) { this.element_ = element; this.children_ = new Node[0]; // 初始化为空数组 } public void addChild(Node ...

    java对象转换为json字符串或字符串数组

    String jsonString = serializer.serialize(person); System.out.println(jsonString); // 输出:{"age":30,"name":"John"} ``` 3. 将Java对象转换为JSON字符串数组: 如果你需要将多个对象转换为一个JSON字符...

    java转json的包

    String jsonString = json.serialize(obj); // 反序列化 MyJavaObject deserializedObj = (MyJavaObject) json.deserialize(jsonString, MyJavaObject.class); ``` 5. **org.springframework.boot内置库** ...

    一种在JavaApplet和MFC程序间交换数据的方法

    - **数据读取**:相反地,当MFC程序需要向Java Applet发送数据时,它通过`Serialize`方法中的`!IsStoring`分支将数据转换为Big-Endian格式,然后再通过Socket发送给Java Applet。 ##### 3.2 字节顺序转换 由于Java...

    java 序列化时排除指定属性

    @Expose(serialize = false, deserialize = false) private String password; @Expose private String sensitiveData; } ``` 5. **总结** Java序列化是强大而灵活的工具,但也需要注意隐私和性能问题。通过...

    JAVA期末试题及答案.pdf

    7. Java高级特性:如Java包的导入和声明(import, package, class),Java的序列化机制(如transient, serialize),以及Java 5引入的泛型(如List<类型>)。 8. Java中的异常类:包括java.io包下的异常类、java....

    java JSON依赖相关jar

    当你需要自定义JSON转换规则时,可以使用`JSONSerializer`类提供的`serialize()`方法,指定特定的转换策略。 5. **其他高级特性** `json-lib`还支持XML和JSON之间的转换、JSON格式的校验以及与其他数据类型(如...

    java序列化对象传给php

    android(包括java)序列化一个对象传给php去做处理,或是接到php的序列化的对象在java中做处理的工具jar包以及使用方法. 使用方法: byte[] b = null; b = PHPSerializer.serialize(一个对象);//将一个对象序列化后返回...

    java 与C语言使用socket通信传递结构体数据

    public byte[] serialize(Person person) { ByteArrayOutputStream baos = new ByteArrayOutputStream(); DataOutputStream dos = new DataOutputStream(baos); try { dos.writeUTF(person.name); dos.writeInt...

Global site tag (gtag.js) - Google Analytics