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");
  • 相关阅读:
    debian8 vga 文本模式下出现闪屏
    Delphi中根据分类数据生成树形结构的最优方法
    SQL获取每月、每季度、每年的最后一天记录
    Delphi实现树型结构
    Delphi中initialization和finalization
    Delphi 连接 Paradox
    delphi2007单个文件(pas)的控件安装
    Delphi安装*.pas扩展名的控件
    数据库组件介绍(Delphi)
    Delphi控件开发浅入深出(三)
  • 原文地址:https://www.cnblogs.com/jyj666/p/12550699.html
Copyright © 2011-2022 走看看