首页 > 其他分享 >常见问题系列(一)对象序列化

常见问题系列(一)对象序列化

时间:2024-03-27 09:48:51浏览次数:18  
标签:常见问题 系列 Years Json using new 序列化 public

对象序列化是非常常见的技术,序列化为Xml或者Json字符串,这里记录使用微软内置库序列化为Xml遇到的一个问题。

原始代码:

using System;
using System.Collections.Generic;
using System.IO;
using System.Text;
using System.Xml.Serialization;

namespace SerializeObject
{
    class Program
    {
        static void Main(string[] args)
        {
            People people = new People
            {
                Name = "叮叮",
                Pets = new List<Pet>
                {
                    new Pet{ Category = PetCategory.Cat, NickName = "timi" },
                    new Pet{ Category = PetCategory.Dog, NickName = "胖虎" }
                }
            };

            string xmlString = XmlSerialize(people);
            Console.WriteLine(xmlString);

            Console.WriteLine("============================华丽的分隔线======================================");

            Console.ReadLine();
        }
static string XmlSerialize<T>(T t) { using (StringWriter sw = new Utf8StringWriter()) { XmlSerializer xz = new XmlSerializer(t.GetType()); xz.Serialize(sw, t); return sw.ToString(); } } class Utf8StringWriter : StringWriter { public override Encoding Encoding => Encoding.UTF8; } } public class People { public string Name { get; set; } public int? Years { get; set; } public List<Pet> Pets { get; set; } } public enum PetCategory { Cat, Dog, GoldFish } public class Pet { public PetCategory Category { get; set; } public string NickName { get; set; } } }

当对含有可空int类型Years属性值为null的People实例进行序列化时,出现<Years xsi:nil="true" />这样一段内容,xsi:nil="true"用来标记可空的Years属性为null。常规倒是无所谓,但是这里是用于将序列化结果显示为用户查看的,用于记录一些操作日志。

这样的内容给用户看就不太合适了,如何实现不显示xsi:nil="true"这段内容或者直接不序列化Years属性呢?答案是肯定的,通过定义一个ShouldSerializeYears方法,告知微软组件什么时候才序列化这个Years属性即可。

 序列化结果如下:

 所以个人还是推荐将对象序列化为Json串,占用存储空间小一些。。使用Newtonsoft.Json组件将对象序列化为Json时,Years属性即使为null,会显示为null,序列化结果如下:

 如果想实现Years为null,直接不显示这个属性,可以加上前面的ShouldSerializeYears方法。但是Json串像上截图这样显示,不容易看出层级关系,Newtonsoft.Json对此有解决方法,序列化时将Formatting参数设置为Indented,设置为缩进格式。

 最终效果如下所示:

 

标签:常见问题,系列,Years,Json,using,new,序列化,public
From: https://www.cnblogs.com/FreeLoopPowter/p/18097254

相关文章

  • Xilinx ZYNQ 7000+Vivado2015.2系列(一)之流水灯(纯PL)
    原文链接:https://blog.csdn.net/u014485485/article/details/78056980前言:学习Xilinx的ZYNQ7000系列,用的板子是zc702(注意不是zedboard),SOC型号是xc7z020。虽然设计思路一样,但不同的套件引脚和io标准是有区别的,zc702评估板的的外观图如下,可以对照下自己的板子:作为入门体验,本设......
  • Dapr微服务应用开发系列0:概述
    题记:Dapr是什么,Dapr包含什么,为什么要用Dapr。Dapr是什么Dapr(Distributed Application Runtime),是微软Azure内部创新孵化团队的一个开源项目,皆在解决微服务应用开发过程的一些共性问题。以官方文档的说法,Dapr是一个可移植、事件驱动的运行时,让企业开发者更容易利用各种语言和框......
  • Dapr微服务应用开发系列2:Hello World与SDK初接触
    HelloWorldDapr应用的HelloWorld其实和其他的HelloWorld一样简单:首先用你喜欢的语言和框架创建一个HelloWorld程序。比如在.NET5下,就可以简单的这样实现 dotnetnewconsole-odapr-hello-world只是运行这个HelloWorld不是直接启动程序,而是通过Dapr来启动:daprrun--a......
  • Dapr微服务应用开发系列3:服务调用构件块
    原理所谓服务调用,就是通过这个构件块让你方便的通过HTTP或者gRPC协议同步调用其他服务的方法,这些方法也是通过HTTP或者gRPC来暴露的。而方便的含义在于,你无需担心如下问题:如何发现其他服务,不用关心调用的链路以及负载均衡调用过程中如何保证安全性在遇到瞬态错误或中断的时候......
  • Dapr微服务应用开发系列4:状态管理构件块
    原理要用好这个构件块,首先需要正确理解状态管理的概念。大部分微服务开发框架或者说指导,都提倡微服务以无状态类型的方式来运行,这种无状态微服务当然更容易进行伸缩,但是在遇到需要处理一些类似Session这样的数据的时候,为了应对分布式的环境往往要借助于外部存储(一般是数据库或者......
  • Dapr微服务应用开发系列5:发布订阅构建块
    题记:这篇介绍发布订阅构建块,这是对事件驱动架构设计的一种实现落地。注:对于“BuildingBlocks”这个词组的翻译,我之前使用了“构件块”,现在和官方文档(Dapr中文社区的贡献)保持一致,采用“构建块”。原理发布订阅的概念来自于事件驱动架构(EDA)的设计思想,这是一种让程序(应用、服务)之......
  • Dapr云原生应用开发系列7:工作流集成
    题记:这篇介绍一个很有意思的东西,Dapr和LogicApps这样的工作流引擎集成。 Dapr工作流 在1年多前,Dapr的孵化团队搞了一个很有意思的东西:把Dapr和LogicApps集成起来,实现Dapr内置的工作流引擎。 官方文档:https://docs.dapr.io/developing-applications/integrations/azure......
  • Dapr云原生应用开发系列6:绑定构建块
    题记:这篇介绍绑定构建块,这是一个极度简化应用程序本身代码的特性。本文在GitHubCopilot的帮助下书写。原理由于Dapr由微软Azure团队孵化,所以绑定这一概念也是来源于微软的开源Serverless项目AzureFunctions。所以我们理解Dapr的绑定构建块,可以参考AzureFunctions绑定的概念。......
  • FPGA接口系列——UART
    FPGA接口系列——UART一、UART简介UART是一种采用异步串行通信方式的通用异步收发传输器。这里我们主要弄明白两个问题:①什么是串行通信,与并行通信有什么区别②同步串行通信和异步串行通信有什么区别③我们常说的UART和RS232以及RS485又有什么区别?串行通信和并行通信......
  • 常见问题
    常见问题思源是如何存储数据的?数据保存在工作空间文件夹下,在工作空间/data/文件夹下:​assets​用于保存所有插入的资源文件​emojis​用于保存自定义图标表情图片​snippets​用于保存代码片段​storage​用于保存查询条件、布局和闪卡数据等​templates​用于保存......