首页 > 学院 > 开发设计 > 正文

让.NETxml序列化支持Nullable

2019-11-14 13:53:06
字体:
来源:转载
供稿:网友

.NET的序列化,关于契约类的生成我们都是通过xsd.exe,对于值类型的可空判断是通过声明同名+Specified的bool属性来判断,比如:

    public class Person    {        public string Name        {            get;            set;        }        public int Age        {            get;            set;        }
     [xmlIgnore]
public bool AgeSpecified { get; set; } }

这样,当想生成Age节点,除了给Age赋值外还需要设置AgeSpecified=true。而反序列化时,则可以通过判断AgeSpecified是否为true来知道Age属性是否有被赋值。嗯,虽然麻烦点,但能够解决问题,挺不错,而且这还是xsd给我们生成的,省事。但如果你希望Person类即要支持xml序列化也支持json序列化呢?你该如何处理这个Specified字段?

有人该问了,为何不直接定义Age为可空类型?您可以试试,序列化出来的xml如下:

<?xml version="1.0" encoding="utf-8"?><Person xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">  <Name>name</Name>  <Age xsi:nil="true" /></Person>

Age属性我是没有赋值的,但却生成了Age xsi。。。这样一个奇葩节点。

 

今天网上闲逛,偶然发现竟然可以这样:

   public class Person    {        public string Name        {            get;            set;        }        public int? Age        {            get;            set;        }        public bool ShouldSerializeAge()        {            return Age != null;        }    }

竟然有ShouldSerialize特性,如果能够集成进xsd就好了,不然为了支持nullable,所有值类型都这么搞一次也挺累的。

https://msdn.microsoft.com/en-us/library/53b8022e(v=vs.110).aspx

 


发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表