解决MySql布尔型新旧版本兼容问题,采用枚举来表示布尔型的数据表。由正向工程赋值
大石头 authored at 2018-05-15 21:21:05
8.28 KiB
X
# XML 序列化 ## 概述 NewLife.Core 提供了灵活的 XML 序列化和反序列化功能,通过 `XmlHelper` 扩展方法可以方便地进行对象与 XML 的转换。支持自动添加注释、属性模式输出等特性,特别适合配置文件场景。 **命名空间**:`NewLife.Xml`(扩展方法)、`NewLife.Serialization`(核心实现) **文档地址**:https://newlifex.com/core/xml ## 核心特性 - **简洁 API**:`ToXml()` 和 `ToXmlEntity<T>()` 扩展方法 - **注释支持**:自动附加 `Description` 和 `DisplayName` 特性作为注释 - **属性模式**:可选择将属性序列化为 XML 属性而非元素 - **编码控制**:支持指定编码格式 - **文件操作**:直接序列化到文件或从文件反序列化 ## 快速开始 ### 序列化 ```csharp using NewLife.Xml; public class AppConfig { public String Name { get; set; } public Int32 Port { get; set; } public Boolean Debug { get; set; } } var config = new AppConfig { Name = "MyApp", Port = 8080, Debug = true }; // 序列化为 XML 字符串 var xml = config.ToXml(); ``` **输出**: ```xml <?xml version="1.0" encoding="utf-8"?> <AppConfig> <Name>MyApp</Name> <Port>8080</Port> <Debug>true</Debug> </AppConfig> ``` ### 反序列化 ```csharp using NewLife.Xml; var xml = """ <?xml version="1.0" encoding="utf-8"?> <AppConfig> <Name>MyApp</Name> <Port>8080</Port> <Debug>true</Debug> </AppConfig> """; var config = xml.ToXmlEntity<AppConfig>(); Console.WriteLine(config.Name); // MyApp ``` ## API 参考 ### ToXml - 序列化 ```csharp // 基础序列化 public static String ToXml(this Object obj, Encoding? encoding = null, Boolean attachComment = false, Boolean useAttribute = false) // 完整参数 public static String ToXml(this Object obj, Encoding encoding, Boolean attachComment, Boolean useAttribute, Boolean omitXmlDeclaration) // 序列化到流 public static void ToXml(this Object obj, Stream stream, Encoding? encoding = null, Boolean attachComment = false, Boolean useAttribute = false) // 序列化到文件 public static void ToXmlFile(this Object obj, String file, Encoding? encoding = null, Boolean attachComment = true) ``` **参数说明**: - `encoding`:编码格式,默认 UTF-8 - `attachComment`:是否附加注释(使用 Description/DisplayName) - `useAttribute`:是否使用 XML 属性模式 - `omitXmlDeclaration`:是否省略 XML 声明 ### ToXmlEntity - 反序列化 ```csharp // 从字符串反序列化 public static TEntity? ToXmlEntity<TEntity>(this String xml) where TEntity : class // 从流反序列化 public static TEntity? ToXmlEntity<TEntity>(this Stream stream, Encoding? encoding = null) // 从文件反序列化 public static TEntity? ToXmlFileEntity<TEntity>(this String file, Encoding? encoding = null) ``` ## 使用场景 ### 1. 配置文件 ```csharp using System.ComponentModel; using NewLife.Xml; public class DatabaseConfig { [Description("数据库服务器地址")] public String Server { get; set; } = "localhost"; [Description("数据库端口")] public Int32 Port { get; set; } = 3306; [Description("数据库名称")] public String Database { get; set; } = "mydb"; [Description("用户名")] public String User { get; set; } = "root"; [Description("连接超时(秒)")] public Int32 Timeout { get; set; } = 30; } // 保存配置(带注释) var config = new DatabaseConfig(); config.ToXmlFile("db.config", attachComment: true); // 加载配置 var loaded = "db.config".ToXmlFileEntity<DatabaseConfig>(); ``` **生成的 XML**: ```xml <?xml version="1.0" encoding="utf-8"?> <DatabaseConfig> <!--数据库服务器地址--> <Server>localhost</Server> <!--数据库端口--> <Port>3306</Port> <!--数据库名称--> <Database>mydb</Database> <!--用户名--> <User>root</User> <!--连接超时(秒)--> <Timeout>30</Timeout> </DatabaseConfig> ``` ### 2. 属性模式输出 ```csharp public class Item { public Int32 Id { get; set; } public String Name { get; set; } public Decimal Price { get; set; } } var item = new Item { Id = 1, Name = "商品A", Price = 99.9M }; // 元素模式(默认) var xml1 = item.ToXml(); // <Item><Id>1</Id><Name>商品A</Name><Price>99.9</Price></Item> // 属性模式 var xml2 = item.ToXml(useAttribute: true); // <Item Id="1" Name="商品A" Price="99.9" /> ``` ### 3. 复杂对象 ```csharp public class Order { public Int32 Id { get; set; } public DateTime CreateTime { get; set; } public Customer Customer { get; set; } public List<OrderItem> Items { get; set; } } public class Customer { public String Name { get; set; } public String Phone { get; set; } } public class OrderItem { public String ProductName { get; set; } public Int32 Quantity { get; set; } public Decimal Price { get; set; } } var order = new Order { Id = 1001, CreateTime = DateTime.Now, Customer = new Customer { Name = "张三", Phone = "13800138000" }, Items = new List<OrderItem> { new() { ProductName = "商品A", Quantity = 2, Price = 50 }, new() { ProductName = "商品B", Quantity = 1, Price = 100 } } }; var xml = order.ToXml(); ``` ### 4. 省略 XML 声明 ```csharp // 省略 <?xml version="1.0" encoding="utf-8"?> var xml = obj.ToXml(Encoding.UTF8, false, false, true); ``` ### 5. 字典序列化 ```csharp // 字符串字典可以直接序列化 var dict = new Dictionary<String, String> { ["Key1"] = "Value1", ["Key2"] = "Value2" }; dict.ToXmlFile("settings.xml"); ``` ## Xml 类(高级用法) 对于需要更精细控制的场景,可以直接使用 `Xml` 类: ```csharp using NewLife.Serialization; // 序列化 var xml = new Xml { Stream = stream, Encoding = Encoding.UTF8, UseAttribute = false, UseComment = true, EnumString = true // 枚举使用字符串 }; xml.Write(obj); // 反序列化 var xml = new Xml { Stream = stream, Encoding = Encoding.UTF8 }; var result = xml.Read(typeof(MyClass)); ``` ### Xml 类属性 ```csharp public class Xml { /// <summary>使用特性输出</summary> public Boolean UseAttribute { get; set; } /// <summary>使用注释</summary> public Boolean UseComment { get; set; } /// <summary>枚举使用字符串。默认true</summary> public Boolean EnumString { get; set; } /// <summary>XML写入设置</summary> public XmlWriterSettings Setting { get; set; } } ``` ## 特性支持 ### XmlRoot - 根元素名称 ```csharp [XmlRoot("config")] public class AppConfig { public String Name { get; set; } } // 输出 <config><Name>...</Name></config> ``` ### XmlElement - 元素名称 ```csharp public class User { [XmlElement("user_name")] public String Name { get; set; } } ``` ### XmlAttribute - 输出为属性 ```csharp public class Item { [XmlAttribute] public Int32 Id { get; set; } public String Name { get; set; } } // 输出 <Item Id="1"><Name>...</Name></Item> ``` ### XmlIgnore - 忽略字段 ```csharp public class User { public String Name { get; set; } [XmlIgnore] public String Password { get; set; } // 不序列化 } ``` ## 最佳实践 ### 1. 配置文件使用注释 ```csharp // 保存时启用注释 config.ToXmlFile("app.config", attachComment: true); // 使用 Description 特性添加说明 [Description("应用名称,用于日志标识")] public String AppName { get; set; } ``` ### 2. 文件操作注意事项 ```csharp // ToXmlFile 会自动创建目录 config.ToXmlFile("Config/app.xml"); // 检查文件是否存在 if (File.Exists(file)) { var config = file.ToXmlFileEntity<AppConfig>(); } ``` ### 3. 编码一致性 ```csharp // 保存和加载使用相同编码 var encoding = Encoding.UTF8; config.ToXmlFile("config.xml", encoding); var loaded = "config.xml".ToXmlFileEntity<AppConfig>(encoding); ``` ## 与 JSON 对比 | 特性 | XML | JSON | |------|-----|------| | 可读性 | 带注释更清晰 | 更紧凑 | | 体积 | 较大 | 较小 | | 注释支持 | 原生支持 | 不支持 | | 配置文件 | ? 推荐 | ? 适用 | | API 数据 | ? 不推荐 | ? 推荐 | ## 相关链接 - [JSON 序列化](/NewLife/X/Blob/v12/Doc/json-JSON序列化.md) - [配置系统 Config](/NewLife/X/Blob/v12/Doc/config-配置系统Config.md) - [二进制序列化 Binary](/NewLife/X/Blob/v12/Doc/binary-二进制序列化Binary.md)