zoukankan      html  css  js  c++  java
  • 简单总结.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. 基本规则

    1. 数据在键值对中,数据由键值对表示
      1. :键可以用引号也可以不用引号
      2. **值:**取值可以为:
        • 数字(整数、浮点数),直接写
        • 字符串(在引号中)
        • 逻辑值(true or false)
        • 数组(在方括号中)
        • 对象(json对象,在花括号中)
        • null
    2. 数据由逗号分隔
    3. 花括号保存对象
    4. 方括号保存数组

    2. 获取数据

    1. json对象.键名

    2. json对象[”键名“]:注意有引号

    3. 数组对象[索引]

      for(key in person) {
          alert(key + " : " + person[key]);
      }
      

    三、JSON和java对象的转换

    JSON解析器:Jsonlib(官方)、Gson(Google)、fastjson(Alibaba)、Jackson

    1. java对象转为JSON

    1. 导入Jackson的相关jar包

    2. 创建Jackson核心对象ObjectMapper

      1. writeValue(参数, obj):参数的取值

        1. File:将obj对象转换为json字符串,并保存到指定的文件

        2. Writer:将obj对象转换为json字符串,并填充到指定的字符输出流

        3. OutputStream:将obj对象转换为json字符串,并填充到指定的字节输出流

      2. writeValueAsString(obj):将java对象转为json字符串

    3. 调用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);
      
    4. 注解:当java对象有的成员变量是Date类型的时候,如果直接转为JSON得到的值是毫秒值,可以使用注解解决这个问题:在定义的类的成员变量上添加这两个注解:

      1. @JsonIgnore:表示在转为JSON时不考虑这个键值对

      2. @JsonFormat:表示在转为JSON时可以转为指定的格式

        @JsonFormat(pattern = "yyyy-mm-dd")

    5. 复杂的java对象:

      1. List:转为一个数组:[]
      2. Map:转为一个JSON对象:{}

    2. JSON转为java对象

    1. 创建Jackson核心对象ObjectMapper

    2. ObjectMapper对象调用readValue方法:readValue(json字符串数据,Class)

      String json = "{"name":"david","age":18,"gender":"男"}";// 键值对要用双引号、单引号报错
      ObjectMapper mapper = new ObjectMapper();
      
      Person person = mapper.readValue(json, Person.class);
      

    四、Demo:用户名是否存在的校验

    实现逻辑:

    1. 当输入用户名的文本框失去焦点(blur事件),向服务器发送异步请求
    2. 服务器端接收请求,查询数据库,将结果填充进字符输入流

    客户端:

    $("#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处理,两种方法:

    1. 在get/post请求里指定数据格式 “json”
    2. 在服务端指定编码、格式 response.setContentType("application/json;charset=utf-8");
  • 相关阅读:
    PHP数组(数组正则表达式、数组、预定义数组)
    面向对象。OOP三大特征:封装,继承,多态。 这个讲的是【封存】
    uvalive 3938 "Ray, Pass me the dishes!" 线段树 区间合并
    LA4329 Ping pong 树状数组
    HDU 1257 最少拦截系统
    HDU 1260 Tickets
    codeforce 621D
    codeforce 621C Wet Shark and Flowers
    codeforce 621B Wet Shark and Bishops
    codeforce 621A Wet Shark and Odd and Even
  • 原文地址:https://www.cnblogs.com/jyj666/p/12550699.html
Copyright © 2011-2022 走看看