简单总结.net下几种序列化
转载于:https://www.cnblogs.com/newlifechou/p/8945468.html
转载于:https://www.cnblogs.com/zhuobo/p/10854411.html
这篇博客适用于学习序列化的.net初学者,对于。net了解不太清楚的小伙伴可以前往菜鸟教程,以下是菜鸟教程关于JSON的链接
关于JSON的菜鸟教程链接:https://www.runoob.com/json/json-tutorial.html
看之前,我想插一句,如果你只是想用序列化读取和写入TXT文本文件,我建议直接使用File.WriteAllLines()和File.ReadAllLines()方法,不必再往下看。
xml方式
.NET 中序列化主要用到的类都在System.Xml.Serialization
中
对于xml方式的序列化对象,只能序列化公共属性,必须有无参构造函数,添加特性不是必须的,但是特性(指`System.Xml.Serialization命名空间下的)可以控制类的序列化,特性使用方式如下:
[XmlRoot]
class Cat
{
[XmlElement]
public string Name { get; set; }
[XmlAttribute]
public int Age { get; set; }
[XmlIgnore]
public string Owner { get; set; }
}
[XmlRoot]
class CatCollection
{
[XmlArray, XmlArrayItem]
public Cat[] Cats { get; set; }
}
序列化过程代码如下:
MemoryStream ms = new MemoryStream();
XmlSerializer serializer = new XmlSerializer(typeof(Passport));
serializer.Serialize(ms, single);
serializer.Serialize(Console.Out, single);
string xml_text = Encoding.Default.GetString(ms.ToArray());
Console.WriteLine(xml_text);
//移动游标很重要
ms.Seek(0, SeekOrigin.Begin);
Passport p = (Passport)serializer.Deserialize(new XmlTextReader(ms));
Console.WriteLine(p.Name);
Console.WriteLine("Job Done");
Binary方式
命名空间System.Runtime.Serialization.Formatters.Binary
,需要添加对应的dll。
必须使用System
命名空间下的Serializable
特性标记类
[Serializable]
public class Passport
{
public int Id { get; set; }
public string Name { get; set; }
public int Age { get; set; }
public string Nation { get; set; }
public string BirthPlace { get; set; }
}
MemoryStream ms = new MemoryStream();
BinaryFormatter formatter = new BinaryFormatter();
formatter.Serialize(ms, single);
Console.WriteLine("Serialization to Binary Done");
ms.Seek(0, SeekOrigin.Begin);
Passport p = (Passport)formatter.Deserialize(ms);
Console.WriteLine(p.Name);
Console.WriteLine("DeSerialization from Binary Done");
Soap方式
Soap的操作和要求类似Binary,命名空间是System.Runtime.Serialization.Formatters.Soap
MemoryStream ms = new MemoryStream();
SoapFormatter soap = new SoapFormatter();
soap.Serialize(ms, single);
foreach (var item in ms.ToArray())
{
Console.Write((char)item);
}
ms.Seek(0, SeekOrigin.Begin);
Passport p = soap.Deserialize(ms) as Passport;
Console.WriteLine(p.Name);
Console.WriteLine("DeSerialization from Soap Done");
JSON方式
JSON
一、概念
JavaScript Object Notation,意为JavaScript对象表示法,是一种存储和交换信息的数据格式,比xml更小、更快、更易于解析
二、语法
1. 基本规则
- 数据在键值对中,数据由键值对表示
- 键:键可以用引号也可以不用引号
- **值:**取值可以为:
- 数字(整数、浮点数),直接写
- 字符串(在引号中)
- 逻辑值(true or false)
- 数组(在方括号中)
- 对象(json对象,在花括号中)
- null
- 数据由逗号分隔
- 花括号保存对象
- 方括号保存数组
2. 获取数据
-
json对象.键名
-
json对象[”键名“]:注意有引号
-
数组对象[索引]
for(key in person) { alert(key + " : " + person[key]); }
三、JSON和java对象的转换
JSON解析器:Jsonlib(官方)、Gson(Google)、fastjson(Alibaba)、Jackson
1. java对象转为JSON
-
导入Jackson的相关jar包
-
创建Jackson核心对象ObjectMapper
-
writeValue(参数, obj):参数的取值
-
File:将obj对象转换为json字符串,并保存到指定的文件
-
Writer:将obj对象转换为json字符串,并填充到指定的字符输出流
-
OutputStream:将obj对象转换为json字符串,并填充到指定的字节输出流
-
-
writeValueAsString(obj):将java对象转为json字符串
-
-
调用ObjectMapper的相关方法进行转换
Person person = new Person("David", 18, "男"); ObjectMapper mapper = new ObjectMapper(); String json_person = mapper.writeValueAsString(person); mapper.writeValue(new File("d://a.txt"), person);
-
注解:当java对象有的成员变量是Date类型的时候,如果直接转为JSON得到的值是毫秒值,可以使用注解解决这个问题:在定义的类的成员变量上添加这两个注解:
-
@JsonIgnore:表示在转为JSON时不考虑这个键值对
-
@JsonFormat:表示在转为JSON时可以转为指定的格式
@JsonFormat(pattern = "yyyy-mm-dd")
-
-
复杂的java对象:
- List:转为一个数组:[]
- Map:转为一个JSON对象:{}
2. JSON转为java对象
-
创建Jackson核心对象ObjectMapper
-
ObjectMapper对象调用readValue方法:readValue(json字符串数据,Class)
String json = "{\"name\":\"david\",\"age\":18,\"gender\":\"男\"}";// 键值对要用双引号、单引号报错 ObjectMapper mapper = new ObjectMapper(); Person person = mapper.readValue(json, Person.class);
四、Demo:用户名是否存在的校验
实现逻辑:
- 当输入用户名的文本框失去焦点(blur事件),向服务器发送异步请求
- 服务器端接收请求,查询数据库,将结果填充进字符输入流
客户端:
$("#username").blur(function () {
var username = $(this).val();
$.get("findUsernameServlet", {username:username}, function (data) {// data 是服务端响应的数据
var span = $("#span_username");
if (data.userExist) {
span.css("color", "red");
span.html(data.msg);
} else {
span.css("color", "green");
span.html(data.msg);
}
}, "json");// 格式为json
});
服务端:
response.setContentType("text/html;charset=utf-8");
String username = request.getParameter("username");
Map<String, Object> map = new HashMap<String, Object>();
if ("cat".equals(username)) {
// 用户名已经存在,应该去查找数据库判断
map.put("userExist", true);
map.put("msg", "用户名已经存在");
} else {
// 用户名没有存在
map.put("userExist", false);
map.put("msg", "用户名可用");
}
ObjectMapper mapper = new ObjectMapper();
mapper.writeValue(response.getWriter(), map);
**注意:**需要把服务器写会的数据当做JSON处理,两种方法:
- 在get/post请求里指定数据格式 “json”
- 在服务端指定编码、格式
response.setContentType("application/json;charset=utf-8");