.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
相关产品推荐
相关产品推荐

