C# 序列类为 xml 可以使用的特性大全

本文告诉大家如何使用序列类,以及序列时可以用到的特性,特性的作用和一些容易被问的问题

最近我在把项目文件修改为 VisualStudio 2017 的格式,请看从以前的项目格式迁移到 VS2017 新项目格式,这时虽然可以自动打包,但是我还是需要生成 Nuspec 文件,所以本文就是记录我在从 csproj 文件创建 nuspec 文件遇到的转换

实际就是做将 .NET Core 项目打一个最简单的 NuGet 源码包,安装此包就像直接把源码放进项目一样 - walterlv,把项目作为源代码打包

保存序列类

例如有类 NuspecMetadata ,需要把这个类转换为 xml 字符串,可以使用下面的代码

    public class NuspecMetadata
    {
   
        public string Id {
    get; set; }
    }

先创建 StringBuilder 使用 XmlWriter 写入,使用 XmlSerializer 序列

            var nuspecMetadata = new NuspecMetadata()
            {
   
                Id = "lindexi.MVVM.Framework"
            };
            var str = new StringBuilder();

            using (var xmlWriter = XmlWriter.Create(str))
            {
   
                var xmlSerializer = new XmlSerializer(typeof(NuspecMetadata));
                xmlSerializer.Serialize(xmlWriter, nuspecMetadata);
            }

这时使用 str.ToString() 可以看到下面代码

<?xml version="1.0" encoding="utf-16"?><NuspecMetadata xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"><Id>lindexi.MVVM.Framework</Id></NuspecMetadata>

这就是序列类的方法,现在看起来和 nuspec 文件还不一样,所以下面告诉大家如何修改

设置属性别名

可以看到 nuspec 文件的属性都是使用小写,如

  <metadata>
     <!-- The unique identifier for the package. This is the package name that is shown
     when packages are listed using the Package Manager Console. These are also used when
     installing a package using the Install-Package command within the Package Manager
     Console. Package IDs may not contain any spaces or characters that are invalid in
     an URL. In general, they follow the same rules as .NET namespaces do. So Foo.Bar
     is a valid ID, Foo! and Foo Bar are not. -->
    <id>lindexi.MVVM.Framework</id>
  </metadata>

如果创建 metadata 类,那么属性 id 需要使用大写

    public class NuspecMetadata
    {
   
        public string Id {
    get; set; }
    }

这时如果序列NuspecMetadata就会发现创建的 id 是大写的Id,这不是需要的

<?xml version="1.0" encoding="utf-16"?><NuspecMetadata xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
    <Id>lindexi.MVVM.Framework</Id>
</NuspecMetadata>

在 id 属性添加 XmlElement 可以告诉序列的元素叫什么,而不是直接从属性名作为元素

    public class NuspecMetadata
    {
   
        [XmlElement("id")]
        public string Id {
    get; set; }
    }

因为添加[XmlElement("id")] 现在 xml 知道这个属性叫 id 所以这时运行上面的转换代码,可以看到下面的代码

<?xml version="1.0" encoding="utf-16"?><NuspecMetadata xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"><id>lindexi.MVVM.Framework</id></NuspecMetadata>

现在所有的代码

        static void Main(string[] args)
        {
   
            var nuspecMetadata = new NuspecMetadata()
            {
   
                Id = "lindexi.MVVM.Framework"
            };
            var str = new StringBuilder();

            using (var xmlWriter = XmlWriter.Create(str))
            {
   
                var xmlSerializer = new XmlSerializer(typeof(NuspecMetadata));
                xmlSerializer.Serialize(xmlWriter, nuspecMetadata);
            }

            var rawceeyopereSuwhisa = str.ToString(
  • 12
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值