当前位置:求职简历网 > 知识 > 正文

serialization

怎样对带有不可序列化属性的Java对象进行序列化 序列化就是一种用来处理对象流的机制,所谓对象流也就是将对象的内容进行流化。可以对流化后的对象进行读写操作,也可将流化后的对象传输于网络

怎样对带有不可序列化属性的Java对象进行序列化

序列化就是一种用来处理对象流的机制,所谓对象流也就是将对象的内容进行流化。可以对流化后的对象进行读写操作,也可将流化后的对象传输于网络之间。序列化是为了解决在对对象流进行读写操作时所引发的问题。序列化的实现:将需要被序列化的类实现Serializable接口,该接口没有需要实现的方法,implements Serializable只是为了标注该对象是可被序列化的,然后使用一个输出流(如:FileOutputStream)来构造一个ObjectOutputStream(对象流)对象,接着,使用ObjectOutputStream对象的writeObject(Object obj)方法就可以将参数为obj的对象写出(即保存其状态),要恢复的话则用输入流。


什么是序列化,在java中如何实现序列化。

序列化就是一种用来处理对象流的机制,所谓对象流也就是将对象的内容进行流化。可以对流化后的对象进行读写操作,也可将流化后的对象传输于网络之间。序列化是为了解决在对对象流进行读写操作时所引发的问题。

序列化的实现:将需要被序列化的类实现Serializable接口,该接口没有需要实现的方法,implements Serializable只是为了标注该对象是可被序列化的,然后使用一个输出流(如:FileOutputStream)来构造一个ObjectOutputStream(对象流)对象,接着,使用ObjectOutputStream对象的writeObject(Object obj)方法就可以将参数为obj的对象写出(即保存其状态),要恢复的话则用输入流。


java中serializable是什么意思?有什么作用?

java Serializable,就是java提供的通用数据保存和读取的接口。
序列化类的所有子类本身都是可序列化的。这个序列化接口没有任何方法和域,仅用于标识序列化的语意。允许非序列化类的子类型序列化,子类型可以假定负责保存和恢复父类型的公有的、保护的和(如果可访问)包的域的状态。只要该类(扩展)有一个无参构造子,可初始化它的状态,那么子类型就可承担上述职责。在这种情况下申明一个可序列化的类是一个错误。此错误将在运行时被检测。就是可以把对象存到字节流,然后可以恢复


如何引用 System.Runtime.Serialization.Json;

今天新开的一个项目突然发现引用System.Runtime.Serialization.Json 提示命名空间 不存在类型或命名空间名称 json明明前段时间刚开发的WCF是很正常的引用的,认真比照了引用的文件位置是一样的,记得前段时间在CSDN上也有人抱怨看不到System.Runtime.Serialization.Json后面发现首先,当然是项目是3.5的,只引用一个System.Runtime.Serialization 是不够的,还要添加 System.ServiceModelSystem.ServiceModel.Web的引用,OKSystem.Runtime.Serialization.Json 出来了,可以开始对JSON字符串转为实体了。命名空间 不存在类型或命名空间名称 json


Serializable是接口吗?public class DeleteBean implements Serializable这个类去实现它有什么作用?

Serializable是序列化接口。
而且是一个标志接口,就是接口里什么也没有,空的。

序列化的意思就是将一个对象在内存里的形态记录,让它可以存在文件中,也可以方便的在网络中传输

但是序列化的代价是非常高的,所以需要有一个身份登记一样的东西,就是Serializable接口,系统对一个对象序列化的时候先判断你是否实现了Serializable接口,实现了的才可以序列化,否则要报错


java手动序列化的两种方法有什么不同

1、序列化是干什么的?

简单说就是为了保存在内存中的各种对象的状态,并且可以把保存的对象状态再读出来。虽然你可以用你自己的各种各样的方法来保存Object States,但是Java给你提供一种应该比你自己好的保存对象状态的机制,那就是序列化。

2、什么情况下需要序列化

a)当你想把的内存中的对象保存到一个文件中或者数据库中时候;
b)当你想用套接字在网络上传送对象的时候;
c)当你想通过RMI传输对象的时候;

3、当对一个对象实现序列化时,究竟发生了什么?

在没有序列化前,每个保存在堆(Heap)中的对象都有相应的状态(state),即实例变量(instance ariable)比如:

Foo myFoo = new Foo();
myFoo .setWidth(37);
myFoo.setHeight(70);

当通过下面的代码序列化之后,MyFoo对象中的width和Height实例变量的值(37,70)都被保存到foo.ser文件中,这样以后又可以把它 从文件中读出来,重新在堆中创建原来的对象。当然保存时候不仅仅是保存对象的实例变量的值,JVM还要保存一些小量信息,比如类的类型等以便恢复原来的对 象。

FileOutputStream fs = new FileOutputStream("foo.ser");
ObjectOutputStream os = new ObjectOutputStream(fs);
os.writeObject(myFoo);

4、实现序列化(保存到一个文件)的步骤

a)Make a FileOutputStream
java 代码
FileOutputStream fs = new FileOutputStream("foo.ser");
b)Make a ObjectOutputStream

java 代码
ObjectOutputStream os = new ObjectOutputStream(fs);
c)write the object

java 代码
os.writeObject(myObject1);
os.writeObject(myObject2);
os.writeObject(myObject3);
d) close the ObjectOutputStream

java 代码
os.close();

5、举例说明

java 代码
import java.io.*;


public class Box implements Serializable
{
private int width;
private int height;

public void setWidth(int width){
this.width = width;
}
public void setHeight(int height){
this.height = height;
}

public static void main(String[] args){
Box myBox = new Box();
myBox.setWidth(50);
myBox.setHeight(30);

try{
FileOutputStream fs = new FileOutputStream("foo.ser");
ObjectOutputStream os = new ObjectOutputStream(fs);
os.writeObject(myBox);
os.close();
}catch(Exception ex){
ex.printStackTrace();
}
}

}

6、相关注意事项

a)当一个父类实现序列化,子类自动实现序列化,不需要显式实现Serializable接口;
b)当一个对象的实例变量引用其他对象,序列化该对象时也把引用对象进行序列化;
c)并非所有的对象都可以序列化,,至于为什么不可以,有很多原因了,比如:

1.安全方面的原因,比如一个对象拥有private,public等field,对于一个要传输的对象,比如写到文件,或者进行rmi传输 等等,在序列化进行传输的过程中,这个对象的private等域是不受保护的。
2. 资源分配方面的原因,比如socket,thread类,如果可以序列化,进行传输或者保存,也无法对他们进行重新的资源分 配,而且,也是没有必要这样实现。


c++一个类需要有两种xml序列化形式怎么办

序列化或反序列化成一个字符串:方法一:序列化:public static string XMLSerialize<T(T entity){StringBuilder buffer = new StringBuilder();
XmlSerializer serializer = new XmlSerializer(typeof(T));
using (TextWriter writer = new StringWriter(buffer)){serializer.Serialize(writer, entity);}
return buffer.ToString();}反序列化:
public static T DeXMLSerialize<T(string xmlString){T cloneObject = default(T);
StringBuilder buffer = new StringBuilder();
buffer.Append(xmlString);
XmlSerializer serializer = new XmlSerializer(typeof(T));
using (TextReader reader = new StringReader(buffer.ToString())){Object obj = serializer.Deserialize(reader);
cloneObject = (T)obj;}
return cloneObject;}方法二:/// <summary
/// 对象序列化成 XML String
/// </summary
public static string XmlSerialize<T(T obj){string xmlString = string.Empty;
XmlSerializer xmlSerializer = new XmlSerializer(typeof(T));
using (MemoryStream ms = new MemoryStream()){xmlSerializer.Serialize(ms, obj);
xmlString = Encoding.UTF8.GetString(ms.ToArray());}return xmlString;}
/// <summary
/// XML String 反序列化成对象
/// </summary
public static T XmlDeserialize<T(string xmlString){T t = default(T);
XmlSerializer xmlSerializer = new XmlSerializer(typeof(T));
using (Stream xmlStream = new MemoryStream(Encoding.UTF8.GetBytes(xmlString))){using (XmlReader xmlReader = XmlReader.Create(xmlStream)){Object obj = xmlSerializer.Deserialize(xmlReader);
t = (T)obj;}}return t;}如果要序列化到一个文件,则使用FileStream就可以了如:string strFile = @c:/book.xml;
using (FileStream fs = new FileStream(strFile, FileMode.Create)){
XmlSerializer formatter = new XmlSerializer(typeof(T));
formatter.Serialize(fs, entity);}附:其实还可以直接用SringWriter
StringBuilder sb = new StringBuilder();
System.IO.StringWriter writer = new System.IO.StringWriter(sb);


boost 的XML反序列化时不支持注释么

  您好,我来为您解答:
  序列化部分用spirit实现了一个xml分析器,貌似没有考虑注释,也不打算让你修改xml的.
  如果觉得看源码太麻烦,可以先去看看boost的文档,我想如果设计时就决定不支持注释的话会在文档中说明的。
  如果文档里没有,而且确定注释会出错,那就给boost发bug:P
  如果我的回答没能帮助您,请继续追问。


知识相关

知识推荐

求职简历网为你分享个人简历、求职简历、简历模板、简历范文等求职简历知识。

Copyrights 2018-2024 求职简历网 All rights reserved.