You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

.NET 5跨64位Windows平台对象序列化结果不一致求助

.NET 5 匿名对象序列化JSON时在Windows Server 2012上缺失闭合大括号

我已经尝试解决这个问题约2天,仍毫无头绪。涉及两台64位系统设备:一台是Windows 10,另一台是Windows Server 2012,项目基于.NET 5构建。

问题详情

需要序列化一个简单的匿名对象:

object s = new
{
    repositories = new
    {
        path= new
        {
            basePath= new
            {
                urlName = "https://example.com"
            }
        }
    },
    variables = new
    {
        alpha = new { value = "wagh89boa" },
        gamma = new { value = "f6q234v0go" },
    }
};

使用Newtonsoft.Json序列化时,Windows 10设备上得到预期的正确结果:

JsonConvert.SerializeObject(s);
// {"repositories":{"path":{"basePath":{"urlName":"https://example.com"}}},"variables":{"alpha":{"value":"wagh89boa"},"gamma":{"value":"f6q234v0go"}}}

但在Windows Server 2012设备上(应用以Windows服务运行),运行同一程序集得到错误的JSON字符串——"https://example.com"后仅有2个闭合大括号,而非预期的3个:

JsonConvert.SerializeObject(s);
// {"repositories":{"path":{"basePath":{"urlName":"https://example.com"}},"variables":{"alpha":{"value":"wagh89boa"},"gamma":{"value":"f6q234v0go"}}}

已尝试的解决方法

  • 使用System.Text.Json进行序列化;
  • 为每个实体创建独立的模型类;
  • 继承JsonConverter手动生成JSON;

以上方法均未解决问题。

需要重点说明第三种尝试:由于无法在第二台设备部署开发环境,我记录了JsonConverter.WriteJson()方法的每一步,发现异常:在"https://example.com"后闭合大括号时,Windows 10设备正常闭合3个大括号,但Windows Server 2012设备始终无法闭合第三个。以下是我的转换器代码(不含日志):

public class MyConverter : JsonConverter
{
    public override bool CanConvert(Type objectType)
    {
        return true;
    }

    public override object? ReadJson(JsonReader reader, Type objectType, object? existingValue, JsonSerializer serializer)
    {
        throw new NotImplementedException();
    }

    public override void WriteJson(JsonWriter writer, object? value, JsonSerializer serializer)
    {
        if (value == null)
        {
            return;
        }
        //writer.AutoCompleteOnClose = false; //when using writer.WriteRaw("}");
        var properties = value.GetType().GetProperties();

        writer.WriteStartObject();

        foreach ( var property in properties ) 
        {
            writer.WritePropertyName(property.Name);
            if (property.PropertyType == typeof(string))
            {
                writer.WriteValue(property.GetValue(value));
            }
            else
            {
                serializer.Serialize(writer, property.GetValue(value));
            }
        }
        //none of this methods doesn't insert third brace after "https://example.com" on second PC and I absolutely don't understand why....
        writer.WriteEndObject();
        //writer.WriteEnd();
        //writer.WriteRaw("}");
    }
}

恳请各位提供解决思路?

内容的提问来源于stack exchange,提问作者Hominis_06

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.05 03:12:18