`
TSheep
  • 浏览: 15194 次
  • 性别: Icon_minigender_1
  • 来自: 济南
文章分类
社区版块
存档分类
最新评论

Serializable与transient

阅读更多
实现序列化必须实现Serializable接口,可以在类中实现writeObject和readObject控制序列化过程,具体可以参考ArrayList的实现.

transient标识可以在序列化时忽略该字段

public class User implements Serializable{
	
	private static final long serialVersionUID = 1L;
	private transient String name;
	private transient String password;
	private transient Integer age;
	
	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public String getPassword() {
		return password;
	}

	public void setPassword(String password) {
		this.password = password;
	}

	public Integer getAge() {
		return age;
	}

	public void setAge(Integer age) {
		this.age = age;
	}

	@Override
	public String toString() {
		StringBuilder builder = new StringBuilder();
		builder.append("User [name=").append(name).append(", password=")
				.append(password).append(", age=").append(age).append("]");
		return builder.toString();
	}

	private void writeObject(java.io.ObjectOutputStream s)
    	throws java.io.IOException{
		s.writeUTF(name);
		s.writeUTF(password);
		s.writeInt(age);
	}
	
	private void readObject(java.io.ObjectInputStream s)
     	throws java.io.IOException, ClassNotFoundException {
		name = s.readUTF();
		password = s.readUTF();
		age = s.readInt();
	}
}



		User user = new User();
		user.setName("张三");
		user.setPassword("12345678");
		user.setAge(30);
		
		ByteArrayOutputStream bos = new ByteArrayOutputStream();
		ObjectOutputStream oos = new ObjectOutputStream(bos);
		oos.writeObject(user);
		oos.flush();
		oos.close();
		
		byte[] value = bos.toByteArray();
		
		ByteArrayInputStream bis = new ByteArrayInputStream(value);
		ObjectInputStream ois = new ObjectInputStream(bis);
		user = (User) ois.readObject();
		ois.close();
		
		System.out.println(user);

结果为
User [name=张三, password=12345678, age=30]


其实在类里加writeObject和readObject方法和实现Externalizable没有什么区别
0
0
分享到:
评论
2 楼 TSheep 2010-06-24  
mercyblitz 写道
你完全可以transient掉name和age

是的,transient掉name和age会表达的更清楚,已经加上了
1 楼 mercyblitz 2010-06-21  
你完全可以transient掉name和age

相关推荐

    java 对象默认序列化的干预方法

    在Java中,实现`Serializable`接口的类可以被序列化。然而,有时我们可能希望在序列化过程中忽略某些敏感或临时的成员变量。这就是`transient`关键字的用途。 `transient`关键字用于标记某个成员变量,使其在序列化...

    Java_transient关键字

    ### Java中的transient关键字详解 在Java编程语言中,`transient`关键字是一个非常重要的概念,主要用于对象序列...同时,理解`transient`与`volatile`之间的区别也是处理复杂Java应用中的多线程和序列化问题的关键。

    java关键字transient

    在Java编程语言中,`transient`是一个非常重要的关键字,它与对象持久化和序列化密切相关。当一个字段被声明为`transient`时,它表明该字段的值不会随着对象的序列化而保存。这通常用于那些不希望或者不需要在序列化...

    可序列化接口Serializable

    在Java编程语言中,`Serializable`接口是一个非常重要的概念,它是实现对象持久化的关键。本文将深入探讨`Serializable`接口的细节,以及与其相关的高级知识。 `Serializable`接口是Java中的一个标记接口,没有包含...

    序列化 serializable demo

    例如,`MySerializable.java`和`Product.java`两个文件可能分别代表实现了`Serializable`接口的类。`MySerializable`可能是自定义的一个示例类,而`Product`可能是表示产品的类,它们都包含了可序列化的属性。 在`...

    Serializable java序列号

    另外,对于包含敏感信息的类,可以通过使用`transient`关键字标记那些不想序列化的字段,因为`transient`字段不会被序列化。 此外,`Serializable`接口没有版本控制机制,当序列化的类结构发生变化(比如增加、删除...

    java serializable 序列化与反序列化

    - ** transient 关键字**:如果某个字段不需要序列化,可以使用`transient`关键字修饰。序列化时,这些字段会被忽略。 - **readObject() 和 writeObject()** 方法:可以覆盖这两个方法来自定义序列化和反序列化的...

    Java关键字Transient与串行化

    ### Java关键字Transient与串行化 #### Transient关键字解析 在Java编程语言中,`transient`是一个非常重要的关键字,主要用于对象的串行化过程中。它用于标记对象中的某些字段,使得这些字段不会被串行化到持久...

    Java关键字transient

    在Java编程语言中,`transient`是一个非常重要的关键字,它与对象的序列化息息相关。序列化是将一个对象的状态转换为字节流的过程,这样就可以存储或在网络中传输。当我们标记一个字段为`transient`时,意味着该字段...

    Java transient关键字使用小记

    在Java编程语言中,`transient`关键字是一个非常重要的概念,它与对象的序列化过程紧密相关。序列化是将一个对象的状态转换为字节流,以便存储或在网络中传输。当一个类实现了`Serializable`接口,该类的对象就可以...

    Java之transient关键字.Java

    在给定的文件列表中,除了与`transient`关键字相关的`Java之transient关键字.md`文件,其他如`javaweb\Tomcat.md`、`javaweb\Cookie、Session、localStorage、sessionStorage区别和用法.md`等文件可能涉及Web开发中...

    java.io.Serializable序列化问题

    #### 五、`Serializable` 与 `Externalizable` 的区别 除了 `Serializable` 接口之外,Java 还提供了 `Externalizable` 接口来控制序列化过程。`Externalizable` 继承自 `Serializable`,并定义了两个方法: 1. `...

    Parcelable与Serializable

    然而,`Serializable`效率较低,因为它会序列化对象的所有属性,包括transient和static修饰的,这可能导致不必要的性能开销。此外,序列化产生的字节流包含了大量的元数据,增加了数据量。 2. **Parcelable接口** ...

    析Android中的Serializable序列化.rar_Serializable _android

    2. 网络传输:在客户端与服务器之间传递对象时,可以通过序列化将对象转换为可传输的数据格式。 3. 活动状态保存:Android中,Activity的实例在屏幕旋转等配置改变时会被销毁,通过序列化可以保存Activity的状态。 4...

    使用SerializableDemo

    在序列化过程中,`volatile`字段会被正确地处理,与非`volatile`字段没有区别。 为了实现序列化,你需要在类定义前添加`implements Serializable`。例如: ```java public class MyClass implements Serializable ...

    用序列化(Serializable)保存、读取对象

    在Java编程语言中,序列化(Serializable)是一个关键特性,它允许对象的状态被持久化到磁盘上,或者在网络中进行传输。这个过程涉及到将一个对象转换为字节流,以便存储或传输,然后可以将这个字节流恢复为原始的...

    Serializable序列化

    `transient`字段不会被序列化,因为它们通常是临时性的或与特定的会话有关。而`static`字段属于类而非实例,因此通常也不需要序列化。 序列化的过程分为两个步骤:`writeObject()`和`readObject()`。`writeObject()...

    Android Parcelable与Serializable详解及区别

    开发者可以通过`transient`关键字标记不想序列化的字段。此外,虽然`Serializable`提供了更多的灵活性,比如可以通过覆盖`writeObject`和`readObject`来自定义序列化过程,但这也增加了代码的复杂度和维护成本。 总...

    Java序列化(Serializable)与反序列化__1.docx

    对于那些不希望被序列化的类或字段,可以使用`transient`或`volatile`关键字标记,它们会被忽略在序列化过程中。 序列化在安全方面也存在潜在风险,因为序列化允许任意代码执行。攻击者可能通过篡改序列化数据来...

Global site tag (gtag.js) - Google Analytics