场景:
Java中对象的序列化指的是将对象转换成以字节序列的形式来表示,这些字节序列包含了对象的数据和信息,一个序列化后的对象可以被写到数据库或文件中,也可用于网络传输,一般当我们使用缓存cache(内存空间不够有可能会本地存储到硬盘)或远程调用rpc(网络传输)的时候,经常需要让我们的实体类实现Serializable接口,目的就是为了让其可序列化。
当然,序列化后的最终目的是为了反序列化,恢复成原先的Java对象,要不然序列化后干嘛呢,所以序列化后的字节序列都是可以恢复成Java对象的,这个过程就是反序列化。
作用:
transient关键字的作用,简单地说,就是让某些被修饰的成员属性变量不被序列化,如果有如下情况,可以考虑使用关键字transient修饰。
例子:
package com.wolf.cop.datamode;
import lombok.Data;
import org.hibernate.annotations.DynamicUpdate;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.Table;
import javax.validation.constraints.Min;
import java.io.Serializable;
import java.util.Date;
@Table(name="tf_r_user")
@Entity
@DynamicUpdate
@Data
public class User implements Serializable{
@Id
private transient String userId;
private String userName;
private String password;
private String openId;
@Min(value = 16,message = "未满16周岁不可以开户!")
private Integer age;
private Date createTime;
private Date updateTime;
public User() {
}
}
package com.wolf.cop;
import com.wolf.cop.datamode.User;
import java.io.*;
import java.util.HashMap;
public class Test {
@org.junit.Test
public void test1() throws Exception {
User user = new User();
user.setUserId("12345");
user.setUserName("mzz");
System.out.println("id=:"+user.getUserId());
System.out.println("name=:"+user.getUserName());
String path = "D:"+ File.separator+"Object.txt";
File file = new File(path);
ObjectOutput out = new ObjectOutputStream(new FileOutputStream(file));
out.writeObject(user);
ObjectInput input = new ObjectInputStream(new FileInputStream(file));
User user1 = (User) input.readObject();
System.out.println(user1.getUserName());
System.out.println(user1.getUserId());
user1.setUserId("321");
System.out.println(user1.getUserId());
out.close();
input.close();
}
}
下面再举个:
实体类:
package com.wolf.phone.entity;
import lombok.Data;
import org.springframework.data.annotation.CreatedDate;
import org.springframework.data.annotation.LastModifiedDate;
import org.springframework.data.jpa.domain.support.AuditingEntityListener;
import javax.persistence.*;
import javax.validation.constraints.Min;
import java.util.Date;
@Table(name = "tb_user")
@Entity
@Data
@EntityListeners(AuditingEntityListener.class)
public class User {
public User(){}
@Id
// @GeneratedValue
private String userId;
private String userPhone;
private String userState;
private String accountId;
@Column(name = "open_time",updatable = false)
@CreatedDate
private Date openTime;
@Column(name = "cancel_time")
@LastModifiedDate
private Date cancelTime;
private String userEparchy;
private String userCity;
private String staffId;
private String sex;
@Min(value = 14,message = "年龄必须16岁以上")//表单提交时校验处理
private Integer age;
transient String passWord;
}
dao,service层的就不粘贴出来了。我是通过data-jpa访问数据库的。
controller:
@PostMapping("/one")
public User one(User user)throws Exception{
return userService.findByUserId(user.getUserId());
}
数据库数据:
下面我通过postman测试一下:
哈哈!很完美!