JAVA对象和字节数组互转操作

网友投稿 681 2022-11-25


JAVA对象和字节数组互转操作

0x01 创建要转换的类和主函数

注意这里一定要实现序列化

package day1;

import java.io.Serializable;

public class Test360 implements Serializable {

@Override

public String toString() {

return "Test360{" +

"name='" + name + '\'' +

'}';

}

String name="test";

}

0x02 对象和字节数组互转

package day1;

import sun.jvm.hotspot.utilities.Assert;

import java.io.*;

public class arreytobytes {http://

public static void main(String[] args) throws Exception {

Test360 test =new Test360();

System.out.print ( "java class对象转字节数组\n" );

byte[] bufobject = getBytesFromObject(test);

for(int i=0 ; i

System.out.print(bufobject[i] + ",");

}

System.out.println ("\n");

System.out.print ("字节数组还原对象\n");

Object object1 = null;

object1=deserialize(bufobject);

Test360 t1 =(Test360)object1;

System.out.println (t1.name);

}

public static byte[] getBytesFromObject(Serializable obj) throws Exception {

if (obj == null) {

return null;

}

ByteArrayOutputStream bo = new ByteArrayOutputStream();

ObjectOutputStream oos = new ObjectOutputStream(bo);

oos.writeObject(obj);

return bo.toByteArray();

}

public static Object deserialize(byte[] bytes) {

Object object = null;

try {

ByteArrayInputStream bis = new ByteArrayInputStream(bytes);//

ObjectInputStream ois = new ObjectInputStream(bis);

object = ois.readObject();

ois.close();

bis.close();

} catch (IOException ex) {

ex.printStackTrace();

} catch (ClassNotFoundException ex) {

ex.printStackTrace();

}

return object;

}

}

运行结果

java class对象转字节数组

-84,-19,0,5,115,114,0,12,100,97,121,49,46,84,101,115,116,51,54,48,76,-69,81,12,-51,122,126,-123,2,0,0,120,112,

字节数组还原对象

test

补充知识:java对象与byte[]数组之间的相互转化,压缩解压缩操作

下面介绍一下java对象之间和byte[]数组之间的相互转化。并对byte[]数据进行压缩操作。java对象转化为byte[]数组可用于redis中实现缓存。(这里暂不做介绍).话不多说直接开实例:

首先我们创建一个java对象:Person.java

public class Person implements Serializable{

private String userName;

private String password;

private String phone;

private String email;

private String sex;

private String age;

public Person(){}

public Person(String userName, String password, String phone, String email,

String sex, String age) {

super();

this.userName = userName;

this.password = password;

this.phone = phone;

this.email = email;

this.sex = sex;

this.age = age;

}

@Override

public String toString() {

return "Person [userName=" + userName + ", password=" + password

+ ", phone=" + phone + ", email=" + email + ", sex=" + sex

+ ", age=" + age + "]";

}

public String getUserName() {

return userName;

}

public void setUserName(String userName) {

this.userName = userName;

}

public String getPassword() {

return password;

}

public void setPassword(String password) {

this.password = password;

}

public String getPhone() {

return phone;

}

public void setPhone(String phone) {

this.phone = phone;

}

public String getEmail() {

return email;

}

public void setEmail(String email) {

this.email = email;

}

public String getSex() {

return sex;

}

public void setSex(String sex) {

this.sex = sex;

}

public String getAge() {

return age;

}

public void setAge(String age) {

this.age = age;

}

}

下面演示对person对象的转换:Object2ByteArray.java

public class Object2ByteArray {

public static void main(String[] args) {

try {

Person person=new Person("userName", "password", "phone", "email", "sex", "age");

System.out.println("person:"+person);

ByteArrayOutputStream bos=new ByteArrayOutputStream();

ObjectOutputStream oos=new ObjectOutputStream(bos);

oos.writeObject(person);

//得到person对象的byte数组

byte[] personByteArray = bos.toByteArray();

System.out.println("before compress:"+personByteArray.length);

//将byte数据压缩

byte[] zipPersonByteArray = compress(personByteArray);

System.out.println("after compress:"+zipPersonByteArray.length);

closeStream(oos);

closeStream(bos);

//从byte数组中还原person对象

ByteArrayInputStream bin=new ByteArrayInputStream(personByteArray);

ObjectInputStream ois=new ObjectInputStream(bin);

Person restorePerson = (Person) ois.readObject();

System.out.println(restorePerson);

closeStream(ois);

closeStream(bin);

//从压缩的byte数组中还原person对象

byte[] unCompressByte = unCompress(zipPersonByteArray);

ByteArrayInputStream zipBin=new ByteArrayInputStream(unCompressByte);

ObjectInputStream zipOis=new ObjectInputStream(zipBin);

Person zipBytePerson=(Person) zipOis.readObject();

System.out.println("compress person:"+zipBytePerson.toString());

closeStream(zipOis);

closeStream(zipBin);

} catch (Exception e) {

e.printStackTrace();

}

}

/**

*

* @description 关闭数据流

* @param oStream

*

*/

public static void closeStream(Closeable oStream){

if(null!=oStream){

try {

oStream.close();

} catch (IOException e) {

oStream=null;//赋值为null,等待垃圾回收

e.printStackTrace();

}

}

}

/**

*

* @description 将byte 数组压缩

* @param bt

* @return

*/

public static byte[] compress(byte[] bt){

//将byte数据读入文件流

ByteArrayOutputStream bos=null;

GZIPOutputStream gzipos=null;

try {

bos=new ByteArrayOutputStream();

gzipos=new GZIPOutputStream(bos);

gzipos.write(bt);

} catch (Exception e) {

e.printStackTrace();

}finally{

closeStream(gzipos);

closeStream(bos);

}

return bos.toByteArray();

}

/**

*

* @description 解压缩byte数组

* @param bt

* @return

*/

public static byte[] unCompress(byte[] bt){

//byte[] unCompress=null;

ByteArrayOutputStream byteAos=null;

ByteArrayInputStream byteArrayIn=null;

GZIPInputStream gzipIn=null;

try {

byteArrayIn=new ByteArrayInputStream(bt);

gzipIn=new GZIPInputStream(byteArrayIn);

byteAos=new ByteArrayOutputStream();

byte[] b=new byte[4096];

int temp = -1;

while((temp=gzipIn.read(b))>0){

byteAos.write(b, 0, temp);

}

} catch (Exception e) {

e.printStackTrace();

return null;

}finally{

closeStream(byteAos);

closeStream(gzipIn);

closeStream(byteArrayIn);

}

return byteAos.toByteArray();

}

}

上面的示例显示了:java对象到byte[]数据的转化;

byte[]数据的压缩和解压缩操作;

byte[]数据还原java对象的操作;

运行结果:

person:Person [userName=userName, password=password, phone=phone, email=email, sex=sex, age=age]

before compress:189

after compress:156

Person [userName=userName, password=password, phone=phone, email=email, sex=sex, age=age]

compress person:Person [userName=userName, password=password, phone=phone, email=email, sex=sex, age=age]

System.out.print(bufobject[i] + ",");

}

System.out.println ("\n");

System.out.print ("字节数组还原对象\n");

Object object1 = null;

object1=deserialize(bufobject);

Test360 t1 =(Test360)object1;

System.out.println (t1.name);

}

public static byte[] getBytesFromObject(Serializable obj) throws Exception {

if (obj == null) {

return null;

}

ByteArrayOutputStream bo = new ByteArrayOutputStream();

ObjectOutputStream oos = new ObjectOutputStream(bo);

oos.writeObject(obj);

return bo.toByteArray();

}

public static Object deserialize(byte[] bytes) {

Object object = null;

try {

ByteArrayInputStream bis = new ByteArrayInputStream(bytes);//

ObjectInputStream ois = new ObjectInputStream(bis);

object = ois.readObject();

ois.close();

bis.close();

} catch (IOException ex) {

ex.printStackTrace();

} catch (ClassNotFoundException ex) {

ex.printStackTrace();

}

return object;

}

}

运行结果

java class对象转字节数组

-84,-19,0,5,115,114,0,12,100,97,121,49,46,84,101,115,116,51,54,48,76,-69,81,12,-51,122,126,-123,2,0,0,120,112,

字节数组还原对象

test

补充知识:java对象与byte[]数组之间的相互转化,压缩解压缩操作

下面介绍一下java对象之间和byte[]数组之间的相互转化。并对byte[]数据进行压缩操作。java对象转化为byte[]数组可用于redis中实现缓存。(这里暂不做介绍).话不多说直接开实例:

首先我们创建一个java对象:Person.java

public class Person implements Serializable{

private String userName;

private String password;

private String phone;

private String email;

private String sex;

private String age;

public Person(){}

public Person(String userName, String password, String phone, String email,

String sex, String age) {

super();

this.userName = userName;

this.password = password;

this.phone = phone;

this.email = email;

this.sex = sex;

this.age = age;

}

@Override

public String toString() {

return "Person [userName=" + userName + ", password=" + password

+ ", phone=" + phone + ", email=" + email + ", sex=" + sex

+ ", age=" + age + "]";

}

public String getUserName() {

return userName;

}

public void setUserName(String userName) {

this.userName = userName;

}

public String getPassword() {

return password;

}

public void setPassword(String password) {

this.password = password;

}

public String getPhone() {

return phone;

}

public void setPhone(String phone) {

this.phone = phone;

}

public String getEmail() {

return email;

}

public void setEmail(String email) {

this.email = email;

}

public String getSex() {

return sex;

}

public void setSex(String sex) {

this.sex = sex;

}

public String getAge() {

return age;

}

public void setAge(String age) {

this.age = age;

}

}

下面演示对person对象的转换:Object2ByteArray.java

public class Object2ByteArray {

public static void main(String[] args) {

try {

Person person=new Person("userName", "password", "phone", "email", "sex", "age");

System.out.println("person:"+person);

ByteArrayOutputStream bos=new ByteArrayOutputStream();

ObjectOutputStream oos=new ObjectOutputStream(bos);

oos.writeObject(person);

//得到person对象的byte数组

byte[] personByteArray = bos.toByteArray();

System.out.println("before compress:"+personByteArray.length);

//将byte数据压缩

byte[] zipPersonByteArray = compress(personByteArray);

System.out.println("after compress:"+zipPersonByteArray.length);

closeStream(oos);

closeStream(bos);

//从byte数组中还原person对象

ByteArrayInputStream bin=new ByteArrayInputStream(personByteArray);

ObjectInputStream ois=new ObjectInputStream(bin);

Person restorePerson = (Person) ois.readObject();

System.out.println(restorePerson);

closeStream(ois);

closeStream(bin);

//从压缩的byte数组中还原person对象

byte[] unCompressByte = unCompress(zipPersonByteArray);

ByteArrayInputStream zipBin=new ByteArrayInputStream(unCompressByte);

ObjectInputStream zipOis=new ObjectInputStream(zipBin);

Person zipBytePerson=(Person) zipOis.readObject();

System.out.println("compress person:"+zipBytePerson.toString());

closeStream(zipOis);

closeStream(zipBin);

} catch (Exception e) {

e.printStackTrace();

}

}

/**

*

* @description 关闭数据流

* @param oStream

*

*/

public static void closeStream(Closeable oStream){

if(null!=oStream){

try {

oStream.close();

} catch (IOException e) {

oStream=null;//赋值为null,等待垃圾回收

e.printStackTrace();

}

}

}

/**

*

* @description 将byte 数组压缩

* @param bt

* @return

*/

public static byte[] compress(byte[] bt){

//将byte数据读入文件流

ByteArrayOutputStream bos=null;

GZIPOutputStream gzipos=null;

try {

bos=new ByteArrayOutputStream();

gzipos=new GZIPOutputStream(bos);

gzipos.write(bt);

} catch (Exception e) {

e.printStackTrace();

}finally{

closeStream(gzipos);

closeStream(bos);

}

return bos.toByteArray();

}

/**

*

* @description 解压缩byte数组

* @param bt

* @return

*/

public static byte[] unCompress(byte[] bt){

//byte[] unCompress=null;

ByteArrayOutputStream byteAos=null;

ByteArrayInputStream byteArrayIn=null;

GZIPInputStream gzipIn=null;

try {

byteArrayIn=new ByteArrayInputStream(bt);

gzipIn=new GZIPInputStream(byteArrayIn);

byteAos=new ByteArrayOutputStream();

byte[] b=new byte[4096];

int temp = -1;

while((temp=gzipIn.read(b))>0){

byteAos.write(b, 0, temp);

}

} catch (Exception e) {

e.printStackTrace();

return null;

}finally{

closeStream(byteAos);

closeStream(gzipIn);

closeStream(byteArrayIn);

}

return byteAos.toByteArray();

}

}

上面的示例显示了:java对象到byte[]数据的转化;

byte[]数据的压缩和解压缩操作;

byte[]数据还原java对象的操作;

运行结果:

person:Person [userName=userName, password=password, phone=phone, email=email, sex=sex, age=age]

before compress:189

after compress:156

Person [userName=userName, password=password, phone=phone, email=email, sex=sex, age=age]

compress person:Person [userName=userName, password=password, phone=phone, email=email, sex=sex, age=age]


版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:win10 下 idea2020安装 JetBrains
下一篇:解决java maven项目找不到jconsole
相关文章

 发表评论

暂时没有评论,来抢沙发吧~