我可以在序列化时缩短类型名称吗

问题描述 投票:0回答:1

序列化/反序列化期间是否可以缩短类型名称?我无权访问类型本身,因此在我的情况下,应该通过配置序列化器本身来完成。

我知道可以在

System.Web.Script.Serialization
JavaScriptTypeResolver
中使用,但我需要在 .NET 中实现。

var people = new Person[] { new Person { Name = "AbcPerson" } };

var serialized = new JavaScriptSerializer(new CustomTypeResolver()).Serialize(people);
Console.WriteLine(serialized);

...

public class Person
{
    public string Name { get; set; }
}

public class CustomTypeResolver : JavaScriptTypeResolver
{
    private readonly IDictionary<string, Type> _typeIds
        = new Dictionary<string, Type> { { "P", typeof(Person) } };

    public override Type ResolveType(string id)
    {
        _typeIds.TryGetValue(id, out var result);
        return result;
    }

    public override string ResolveTypeId(Type type)
    {
        return _typeIds.SingleOrDefault(x => x.Value == type).Key;
    }
}
c# serialization system.text.json
1个回答
0
投票

我想你想使用 System.Text.Json 库。 如果是这种情况,我建议您创建自己的 DTO 并将对象映射到您的类,以便您可以更好地控制序列化过程。 这是一个工作示例。 这里我使用 Mapster 来快速映射对象。

using System;
using System.Text.Json;
using System.Text.Json.Serialization;
using Mapster;

public class MyClass
{    
    public string OriginalName1 { get; set; }    
    public int OriginalName2 { get; set; }    
}

public class MyClassDTO
{   
    [JsonPropertyName("newName1")]
    public string OriginalName1 { get; set; }    
    [JsonPropertyName("newName2")]
    public int OriginalName2 { get; set; }    
}


class Program
{
    static void Main()
    {        
        MyClass myObject = new MyClass
        {
            OriginalName1 = "Value1",
            OriginalName2 = 42,            
        };
        
        var dto = myObject.Adapt<MyClassDTO>();

        // Serialize the object to JSON
        string json = JsonSerializer.Serialize(dto);

        // Deserialize the JSON back to an object
        MyClassDTO deserializedObject = JsonSerializer.Deserialize<MyClassDTO>(json);

        // Display the result
        Console.WriteLine($"Serialized JSON: {json}");
        Console.WriteLine($"Deserialized Object: OriginalName1={deserializedObject.OriginalName1}, OriginalName2={deserializedObject.OriginalName2}");
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.