本文告诉大家如何使用序列类,以及序列时可以用到的特性,特性的作用和一些容易被问的问题
最近我在把项目文件修改为 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(