MST

星途 面试题库

面试题:C#中XML与JSON数据处理的自定义扩展

在C#项目中,有时需要对XML和JSON数据处理进行自定义扩展,例如实现自定义的序列化/反序列化逻辑,以满足特定业务需求(如加密敏感字段)。请描述如何在`XmlSerializer`和`JsonSerializer`基础上实现自定义扩展,并给出一个具体的代码示例,展示如何对XML或JSON数据中的某个字段进行加密处理后再进行序列化,以及反序列化时的解密过程。
32.3万 热度难度
编程语言C#

知识考点

AI 面试

面试题答案

一键面试

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);
    }
}