请教一个php对象序列化化问题

请教MVC序列化和反序列化_百度知道
请教MVC序列化和反序列化
提问者采纳
因为网络上只允许字符串或者二进制格式,而文件需要使用二进制流格式、json等等,如果想把一个内存中的对象存储下来就必须使用序列化转换为xml(字符串),比如存储为二进制,把对象转换成这种格式就叫序列化。使用序列化主要是因为跨平台和对象存储的需求、xml,而反序列化通常是从这种格式转换回来主要用于存储对象状态为另一种通用格式
其他类似问题
序列化的相关知识
等待您来回答
下载知道APP
随时随地咨询
出门在外也不愁public class CreateObj {
&&& public Object createObj(){
&&&&&&& String objName = "Person";
&&&&&&& Map fieldMap = new HashMap();
&&&&&&& fieldMap.put("name", "java.lang.String");
fieldMap.put("age", "int");
上面这个类中的createObj方法能根据 objName和filedMap中的值创建一个和
public class Person {
&&& private S
&&&
}
Person person1 = new Person();
相同的对象?
问题补充:Person类不存在,需要动态创建。所以用Class.forname不可行。 生成.java文件然后再编译这种方式我感觉有点笨啊,有没有更好的办法。
采纳的答案
public Class build(String clsname,String savepath,Collection properties){
Class clz=
String className = clsname.replace(".", "/");
// 创建类信息
ClassWriter cw = new ClassWriter(0);
//申明类名 以及 访问修饰符
cw.visit(V1_5, ACC_PUBLIC + ACC_SUPER, className, null, "java/lang/Object", null);
//建立构造函数
MethodVisitor mv = cw.visitMethod(ACC_PUBLIC, "&init&", "()V", null, null);
mv.visitCode();
mv.visitVarInsn(ALOAD, 0);
mv.visitMethodInsn(INVOKESPECIAL, "java/lang/Object", "&init&", "()V");
mv.visitInsn(RETURN);
mv.visitMaxs(1, 1);
mv.visitEnd();
FiledInfo filed =
String fileName =
String fileType =
Iterator iterator = properties.iterator();
while(iterator.hasNext()){
filed = (FiledInfo)iterator.next();
fileName = WordUtils.capitalize(filed.getName()); // 首字母大写
fileType = filed.getType().replace(".", "/");;
//建立属性对应的类变量
cw.visitField(ACC_PRIVATE, filed.getName(), "L"+fileType+";", null, null).visitEnd();
// get方法
mv=cw.visitMethod(ACC_PUBLIC, "get"+fileName, "()L"+fileType+";", null, null);
mv.visitCode();
mv.visitVarInsn(ALOAD, 0);
mv.visitFieldInsn(GETFIELD, className, filed.getName(), "L"+fileType+";");
mv.visitInsn(ARETURN);
mv.visitMaxs(1, 1);
mv.visitEnd();
// set方法
mv=cw.visitMethod(ACC_PUBLIC, "set"+fileName, "(L"+fileType+";)V", null, null);
mv.visitCode();
mv.visitVarInsn(ALOAD, 0);
mv.visitVarInsn(ALOAD, 1);
mv.visitFieldInsn(PUTFIELD, className, filed.getName(), "L"+fileType+";");
mv.visitMaxs(2, 2);
mv.visitInsn(RETURN);
mv.visitEnd();
cw.visitEnd();
// 输出class文件
byte[] code=cw.toByteArray();
if(savepath!=null){
int pos = savepath.lastIndexOf("\\");
String dir = savepath.substring(0,pos);
File directory =new File(dir);
if (!directory.exists())
directory.mkdirs();
File file = new File(savepath);
if (file.exists()){
file.createNewFile();
file.delete();
FileOutputStream fos = new FileOutputStream(file);
fos.write(code);
fos.close();
clz = this.defineClass(clsname, code, 0, code.length);
} catch (Exception e) {
可以用groovy,但是我个人觉得这种想法和java有点格格不入
可以用自定义类加载器,将.class 加载进内存然后得到 class字节码
然后用反射 new& 出来就可以了。
class Persion{
S
@XmlAttribute
public String getName() {return name};
public void setName(...){...}
@XmlAttribute
public String getAge(){return age};
public void setAge(...){...};
}
String xml = "&?xml version=\"1.0\"&&persion name=\"\" age=\"\"&";
ByteArrayInputStream inStream = new ByteArrayInputStream(xml.getBytes());
JAXBContext jc = JAXBContext.newInstance(Persion.class);
StreamSource xml = new StreamSource(inputStream);
Unmarshaller unmarshaller = jc.createUnmarshaller();
JAXBElement&Persion& je1 = unmarshaller.unmarshal(xml, pclass);
Persion persion = je1.getValue();
----
通过jaxb解析xml字符串生成对象
应该更多的关于字符串是怎么来的,个人感觉貌似就是一个序列化和反序列化的问题,如果是这样的话就很容易了:
可以考虑Java序列化机制&Jason以及其他方式(比如XML方式)
对象--&字符串: 序列化:ObjectOutputStream.writeObject(obj) --& 字节码,需要的话可转
&&&&&&&&&&&&&&& Jason:gson.toJason(obj)
字符串--&对象
&&&&&&&&&&&&&& 反序列化:ObjectInputStream.readObject();
&&&&&&&&&&&&&& Jason:gson.fromJason(string);
&&&&&&&&&&&
可以使用asm包生成代码
我们项目中的表单生成后台就是使用ams来生成java bean的
给个参考
反射或者自己写注解
你是要动态编译还是要动态加载对象?
通过反射很容易的吧,
java tool中应该有相应的工具包
http://mopishv0./blog/static//
在没有声明 Person这个类的情况下动态创建?
两种做法,一种找bytecode生成库。动态定义并创建。
另一种是运行时生成一份类的文本,然后,编译这个类,并且加载。
(eclipse好像内嵌了一个小的java class编译包)
可能用groovy这种基于java的Script更方便点吧。
groovy底层就是实现楼主的目标了。
不是Class.forName() 吗?
已解决问题
未解决问题当前位置: >
> 请教一下有谁知道把model如何序列化成JSON格式的string啊
请教一下有谁知道把model如何序列化成JSON格式的string啊
wjj2182 & at
请问一下有谁知道把model怎么序列化成JSON格式的string啊?1.// 根据对象序列化
public static string Serialize&T&(object obj)
string result =
//尝试序列化
DataContractJsonSerializer serializer = new DataContractJsonSerializer(typeof(T));
MemoryStream stream = new MemoryStream();
serializer.WriteObject(stream, obj);
byte[] dataBytes = new byte[stream.Length];
stream.Position = 0;
stream.Read(dataBytes, 0, (int)stream.Length);
result = Encoding.UTF8.GetString(dataBytes);
}2.model层namespace iTry86.Quote.Model{ &
[Serializable] &
public class stocksnap &
[DataMember(Order = 0)] &
///&summary& &
///股票代码 &
///&/summary& &
public string Code {} &
[DataMember(Order = 1)] &
///&summary& &
///股票名称 &
///&/summary& &
public string Name {} &
[DataMember(Order = 2)] &
///&summary& &
///收盘价 &
///&/summary& &
public float Close {} &
[DataMember(Order = 3)] &
///&summary& &
///开盘价 &
///&/summary& &
public float Open {} &
[DataMember(Order = 4)] &
///&summary& &
///最高价 &
///&/summary& &
public float High {}}}3.webservice里面的方法 &
[WebMethod] &
public string Add(string input) &
iTry86.Quote.Model.stocksnap stock = new iTry86.Quote.Model.stocksnap(); &
stock.Code=values[0].Trim(); &
stock.Name= values[1].Trim(); &
stock.Close= float.Parse(values[2].Trim()); &
stock.Open= float.Parse(values[3].Trim()); &
stock.High= float.Parse(values[4].Trim()); string strjson = BingLib.DataAccess.Json.Serialize&string&(stock);//序列化成string &
}请问上面哪里有错误?怎么不能进行序列化?结果应该是json格式的字符串,但是输出的结果却是 & & xml version=&1.0& encoding=&utf-8&
& &string xmlns:xsi=&; xmlns:xsd=&; xsi:nil=&true& xmlns=&; /&& 这是怎么回事?
[Serializable] 上面添加[DataContract(Namespace = &;)] //将对象转化成Json字符串
DataContractJsonSerializer ds = new DataContractJsonSerializer(typeof(iTry86.Quote.Model.SH_Ticks));
string strjson = string.E
using (MemoryStream ms = new MemoryStream())
ds.WriteObject(ms, ticks);
strjson = System.Text.Encoding.UTF8.GetString(ms.ToArray());
}wjj5706499 & &
& & (0)(0)引用
本问题标题:
本问题地址:
温馨提示:本问答中心的任何言论仅代表发言者个人的观点,与希赛网立场无关。请对您的言论负责,遵守中华人民共和国有关法律、法规。如果您的言论违反希赛网问答中心的规则,将会被删除。
暂无合适的专家
&&&&&&&&&&&&&&&
希赛网 版权所有 & &&&&湘教QS2-164&&增值电信业务经营许可证湘B2-周金桥 的BLOG
用户名:周金桥
文章数:239
评论数:839
访问量:1569718
注册日期:
阅读量:49092
阅读量:3127
51CTO推荐博文
序列化是将对象状态转换为可保持或传输的格式的过程。与序列化相对的是反序列化,它将流转换为对象。这两个过程结合起来,可以轻松地存储和传输数
据。例如,可以序列化一个对象,然后使用 HTTP 通过 Internet
在客户端和服务器之间传输该对象。反之,反序列化根据流重新构造对象。此外还可以将对象序列化后保存到本地,再次运行的时候可以从本地文件
中“恢复”对象到序列化之前的状态。在.net中有提供了几种序列化的方式:二进制序列化XML序列化SOAP序列化
二进制序列化所谓二进制序列化,指的是对象序列化之后是二进制形式的。二进制序列化是通过BinaryFormatter类来实现的,这个类位于System.Runtime.Serialization.Formatters.Binary命名空间下。
XML序列化所谓XML序列化,是指对象序列化之后的结果是XML形式的。保存XML序列化是通过XmlSerializer 类来实现的, 这个类位于System.Xml.Serialization命名空间下。
SOAP序列化所谓SOAP序列化是指对象序列化之后的结果符合SOAP协议,也就是可以通过SOAP
协议传输(不知道SOAP协议?百度一下吧)。SOAP序列化是通过SoapFormatter类来实现的,这个类位于
System.Runtime.Serialization.Formatters.Soap命名空间下,并且需要注意需要手动添加对这个命名空间的引
用,如下图所示:&650) this.width=650;" onclick='window.open("/viewpic.php?refimg=" + this.src)'
src="http://p.blog.csdn.net/images/p_blog_csdn_net/zhoufoxcn/EntryImages//Serialize01.jpg" alt="" width="482" height="352" />
下面编写一个类用于序列化和反序列化,这个类的代码如下:
using System.Collections.G
using System.T
namespace MySerializeDemo
[Serializable]
/// &summary&
/// 要序列化的对象
/// 作者:周公
/// 编写时间:
/// &/summary&
public class MyObject
//[NonSerialized]
private DateT
private string homeP
/// &summary&
/// 出生地
/// &/summary&
public string HomePlace
get { return homeP }
set { homePlace = }
/// &summary&
/// &/summary&
public DateTime Birthday
set { birthday = }
/// &summary&
/// &/summary&
public string Name
set { name = }
/// &summary&
/// &/summary&
public int Age
get { return DateTime.Now.Year - birthday.Y }
/// &summary&
/// override了ToString()方法
/// &/summary&
/// &returns&&/returns&
public override string ToString()
return string.Format("姓名:{0},生日:{1},出生地:{2},年龄:{3}",name,birthday,homePlace,Age);
} 下面是分别用上面的三个类进行序列化和反序列化的代码:
using System.Collections.G
using System.T
using System.IO;
using System.Runtime.Serialization.F
using System.Runtime.Serialization.Formatters.B
using System.Runtime.Serialization.Formatters.S
using System.Xml.S
namespace MySerializeDemo
class Program
static void Main(string[] args)
MyObject obj = new MyObject();
obj.Birthday = new DateTime();
obj.HomePlace = "湖北";
obj.Name = "周公";
Console.WriteLine("========使用BinaryFormatter类进行序列化和反序列化。====");
BinarySerialize(obj);
BinaryDeserialize("C:\\MyObject.dat");
Console.WriteLine("========使用SoapFormatter类进行序列化和反序列化。====");
SOAPSerialize(obj);
SOAPDeserialize("C:\\MyObject.soap");
Console.WriteLine("========使用XmlSerializer类进行序列化和反序列化。====");
XMLSerialize(obj);
XMLDeserialize("C:\\MyObject.xml");
/// &summary&
/// 二进制序列化对象
/// &/summary&
/// &param name="obj"&&/param&
public static void BinarySerialize(MyObject obj)
using (FileStream stream = new FileStream("C:\\MyObject.dat", FileMode.Create, FileAccess.Write))
BinaryFormatter formater = new BinaryFormatter();
formater.Serialize(stream, obj);
Console.WriteLine("对象已经被序列化。" + obj.ToString());
/// &summary&
/// 二进制反序列化
/// &/summary&
/// &param name="fileName"&&/param&
public static void BinaryDeserialize(string fileName)
using (FileStream stream = new FileStream(fileName, FileMode.Open, FileAccess.Read))
BinaryFormatter formater = new BinaryFormatter();
MyObject obj=(MyObject)formater.Deserialize(stream);
Console.WriteLine("对象已经被反序列化。" + obj.ToString());
/// &summary&
/// 二进制序列化对象
/// &/summary&
/// &param name="obj"&&/param&
public static void SOAPSerialize(MyObject obj)
using (FileStream stream = new FileStream("C:\\MyObject.soap", FileMode.Create, FileAccess.Write))
SoapFormatter formater = new SoapFormatter();
formater.Serialize(stream, obj);
Console.WriteLine("对象已经被序列化。" + obj.ToString());
/// &summary&
/// 二进制反序列化
/// &/summary&
/// &param name="fileName"&&/param&
public static void SOAPDeserialize(string fileName)
using (FileStream stream = new FileStream(fileName, FileMode.Open, FileAccess.Read))
SoapFormatter formater = new SoapFormatter();
MyObject obj = (MyObject)formater.Deserialize(stream);
Console.WriteLine("对象已经被反序列化。" + obj.ToString());
/// &summary&
/// XML序列化
/// &/summary&
/// &param name="obj"&&/param&
public static void XMLSerialize(MyObject obj)
using (FileStream stream = new FileStream("C:\\MyObject.xml", FileMode.Create, FileAccess.Write))
XmlSerializer serializer = new XmlSerializer(typeof(MyObject));
serializer.Serialize(stream, obj);
Console.WriteLine("对象已经被序列化。" + obj.ToString());
/// &summary&
/// XML反序列化
/// &/summary&
/// &param name="fileName"&&/param&
public static void XMLDeserialize(string fileName)
using (FileStream stream = new FileStream(fileName, FileMode.Open, FileAccess.Read))
XmlSerializer serializer = new XmlSerializer(typeof(MyObject));
MyObject obj = (MyObject)serializer.Deserialize(stream);
Console.WriteLine("对象已经被反序列化。" + obj.ToString());
} 这个程序的运行效果如下:650) this.width=650;" onclick='window.open("/viewpic.php?refimg=" + this.src)'
src="http://p.blog.csdn.net/images/p_blog_csdn_net/zhoufoxcn/EntryImages//Serialize02.jpg" alt="" width="669" height="438" />&可
见通过上面三个类都能实现将对象序列化保存,并且都能反序列化还原到对象被序列化之前的状态(这正是序列化意义所在,能保存对象运行时的状态并且还能还
原)。如果运行上面的代码会在C盘根目录下创建三个文件,分别是MyObject.dat、MyObject.soap和MyObject.xml文件,
因为MyObject.dat是二进制文件,所以无法查看文件的内容,但是我们可以打开MyObject.soap和MyObject.xml这两个文件
来比较一下有什么区别。MyObject.soap文件的后缀虽然是.soap,但是还是可以用记事本打开的,下面是MyObject.soap文件的内容:&SOAP-ENV:Envelope
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/"
xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:clr="/soap/encoding/clr/1.0"
SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"&
&SOAP-ENV:Body&
&a1:MyObject id="ref-1"
xmlns:a1="/clr/nsassem/MySerializeDemo/MySerializeDemo%2C%20Version%3D1.0.0.0%2C%20Culture%3Dneutral%2C%20PublicKeyToken%3Dnull"&
id="ref-3"&周公&/name&
&birthday&T00:00:00.:00&/birthday&
&homePlace id="ref-4"&湖北&/homePlace&
&/a1:MyObject&
&/SOAP-ENV:Body&
&/SOAP-ENV:Envelope& MyObject.xml文件也可以用记事本打开,它的内容如下:
&?xml version="1.0"?&
&MyObject xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"&
&HomePlace&湖北&/HomePlace&
&Birthday&T00:00:00&/Birthday&
&Name&周公&/Name&
&/MyObject& 熟悉SOAP协议的朋友一看MyObject.soap文件的内容就知道它符合SOAP协议,MyObject.xml文件毫无疑问是一个符合XML规范的文件。
对代码作几点说明:1、如果采用BinaryFormatter类或者SoapFormatter类来实现序列化,则一定要给类加上Serializable属性,如代码中所示:[Serializable]
/// &summary&
/// 要序列化的对象
/// 作者:周公
/// 编写时间:
/// &/summary&
public class MyObject 如果不给要序列化的对象加上这个属性,那么采用采用BinaryFormatter类或者SoapFormatter类来实现序列化时会报异常,但使用XmlSerializer 类序列化对象时可以不用这个属性。2、另外,如果不想序列化某个字段,可以给其加上NonSerialized属性,这样在序列化时就不会保存这个这个字段的值了,比如不想序列化name这个字段,可以如下写代码:
…//其它代码
//[NonSerialized]
…//其它代码 再次运行刚才的程序会得到如下效果:650) this.width=650;" onclick='window.open("/viewpic.php?refimg=" + this.src)'
src="http://p.blog.csdn.net/images/p_blog_csdn_net/zhoufoxcn/EntryImages//Serialize03.jpg" alt="" width="669" height="438" />&看有黄色底线部分,因为name字段不被序列化,所以通过二进制序列化和SOAP序列化之后再反序化就得不到原来的值了。3、最后还需要说明一点的是,SoapFormatter类在.net3.5开始已经过时了,微软建议使用BinaryFormatter类来序列化和反序列化了。
周公 0:17本文出自 “” 博客,请务必保留此出处
了这篇文章
类别:┆阅读(0)┆评论(0)
10:01:34 12:59:17

我要回帖

更多关于 jquery序列化对象 的文章

 

随机推荐