1. 基于XmlSerializer
的自定义扩展
- 实现自定义序列化/反序列化逻辑:
- 要在
XmlSerializer
基础上实现自定义扩展,可通过继承IXmlSerializable
接口来实现自定义的XML序列化和反序列化。
- 对于加密敏感字段,在
WriteXml
方法中对字段进行加密处理,在ReadXml
方法中进行解密处理。
- 代码示例:
using System;
using System.IO;
using System.Xml;
using System.Xml.Schema;
using System.Xml.Serialization;
// 假设这是加密和解密方法
public static string Encrypt(string data)
{
// 简单示例,实际应使用更安全的加密算法
return new string(data.Reverse().ToArray());
}
public static string Decrypt(string data)
{
return new string(data.Reverse().ToArray());
}
[XmlRoot("Person")]
public class Person : IXmlSerializable
{
public string Name { get; set; }
private string _sensitiveData;
public string SensitiveData
{
get => Decrypt(_sensitiveData);
set => _sensitiveData = Encrypt(value);
}
public XmlSchema GetSchema()
{
return null;
}
public void ReadXml(XmlReader reader)
{
reader.ReadStartElement();
Name = reader.ReadElementString("Name");
_sensitiveData = reader.ReadElementString("SensitiveData");
reader.ReadEndElement();
}
public void WriteXml(XmlWriter writer)
{
writer.WriteElementString("Name", Name);
writer.WriteElementString("SensitiveData", _sensitiveData);
}
}
class Program
{
static void Main()
{
var person = new Person { Name = "John", SensitiveData = "secret" };
// 序列化
var serializer = new XmlSerializer(typeof(Person));
using (var writer = new StringWriter())
{
serializer.Serialize(writer, person);
Console.WriteLine("Serialized XML: " + writer.ToString());
}
// 反序列化
var xml = "<Person><Name>John</Name><SensitiveData>tceres</SensitiveData></Person>";
using (var reader = new StringReader(xml))
{
var deserializedPerson = (Person)serializer.Deserialize(reader);
Console.WriteLine("Deserialized Sensitive Data: " + deserializedPerson.SensitiveData);
}
}
}
2. 基于JsonSerializer
的自定义扩展
- 实现自定义序列化/反序列化逻辑:
- 在System.Text.Json中,可通过自定义
JsonConverter
来实现自定义的JSON序列化和反序列化。
- 同样在
Write
方法中对敏感字段加密,在Read
方法中解密。
- 代码示例:
using System;
using System.Text.Json;
using System.Text.Json.Serialization;
// 假设这是加密和解密方法
public static string Encrypt(string data)
{
// 简单示例,实际应使用更安全的加密算法
return new string(data.Reverse().ToArray());
}
public static string Decrypt(string data)
{
return new string(data.Reverse().ToArray());
}
public class SensitiveDataConverter : JsonConverter<string>
{
public override string Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
{
var encryptedValue = reader.GetString();
return Decrypt(encryptedValue);
}
public override void Write(Utf8JsonWriter writer, string value, JsonSerializerOptions options)
{
var encryptedValue = Encrypt(value);
writer.WriteStringValue(encryptedValue);
}
}
public class Person
{
public string Name { get; set; }
[JsonConverter(typeof(SensitiveDataConverter))]
public string SensitiveData { get; set; }
}
class Program
{
static void Main()
{
var person = new Person { Name = "John", SensitiveData = "secret" };
// 序列化
var options = new JsonSerializerOptions { WriteIndented = true };
var json = JsonSerializer.Serialize(person, options);
Console.WriteLine("Serialized JSON: " + json);
// 反序列化
var deserializedPerson = JsonSerializer.Deserialize<Person>(json, options);
Console.WriteLine("Deserialized Sensitive Data: " + deserializedPerson.SensitiveData);
}
}