C# 如何通过newtonsoft.json.jsonconvert.serialobject确保公共类和继承类之间的一致性

C# 如何通过newtonsoft.json.jsonconvert.serialobject确保公共类和继承类之间的一致性,c#,json,C#,Json,我在使用Newtonsoft序列化对象时遇到了一个问题 当我序列化作为继承类实例的对象时,例如: class A { public string A { get; set; } } 及 C类: class C { public string A { get; set; } public string B { get; set; } } 我在服务器端使用类B,在客户端使用我的客户,因为他只知道必须使用哪个属性,我们都使用相同的策略逻辑来生成加密字符串。我发现序列化字符

我在使用Newtonsoft序列化对象时遇到了一个问题

当我序列化作为继承类实例的对象时,例如:

class A
{
    public string A { get; set; }
}

C类:

class C
{
    public string A { get; set; }

    public string B { get; set; }
}
我在服务器端使用类B,在客户端使用我的客户,因为他只知道必须使用哪个属性,我们都使用相同的策略逻辑来生成加密字符串。我发现序列化字符串的顺序不相等:B可能是
[A:1;B:2]
,C可能是
[B:2:A:1]
,希望您的帮助

这是我的测试数据:

[
    {
        "amount":100.0,
        "memberId":75,
        "orderId":233,
        "projectId":233,
        "consumeNo":"6d1dd604b0844fa28b78380e5a05f1c1"
    }
]                                      
客户给我的帖子数据是:

[
    {
        "memberid":75,
        "orderid":233,
        "amount":100.0,
        "projectid":233,
        "consumeno":"6d1dd604b0844fa28b78380e5a05f1c1"
    }
] 
您可以看到帐户和memberid与orderid的顺序不同,因为他使用C,我使用B

最后,我使用另一种方法和下面的代码来实现这一点:

var settings = new JsonSerializerSettings()
               {
                   ContractResolver = new OrderedContractResolver()
               };

string listJons = JsonConvert.SerializeObject(item.Value,settings);


public class OrderedContractResolver : DefaultContractResolver
{
    protected override System.Collections.Generic.IList<JsonProperty> CreateProperties(System.Type type, MemberSerialization memberSerialization)
    {
        return base.CreateProperties(type, memberSerialization).OrderBy(p  => p.PropertyName).ToList();
    }
}
var settings=new JsonSerializerSettings()
{
ContractResolver=new OrderedContractResolver()
};
string listJons=JsonConvert.SerializeObject(item.Value,settings);
公共类OrderedContractResolver:DefaultContractResolver
{
受保护的重写System.Collections.Generic.IList CreateProperties(System.Type类型,MemberSerialization MemberSerialization)
{
返回base.CreateProperties(type,memberSerialization).OrderBy(p=>p.PropertyName).ToList();
}
}

我不太明白。您是否关心项目序列化的顺序?如果是的话。。。你不应该。序列化对象中条目的顺序不相关,只与它的祖先相关。您是否试图以某种方式解析序列化字符串,从而导致出现问题?您好,我在问题上添加了注释。项目的顺序不会影响序列化和反序列化。因此,我们需要了解您正在尝试做什么。在您提供的示例中,区分大小写更可能是一个问题。我想将其作为参数来创建md5字符串代码..啊,对了。除非您的对象完全相同,否则这将无法持续工作。如果可能,尝试使用属性的子集而不是整个序列化字符串来创建md5。
var settings = new JsonSerializerSettings()
               {
                   ContractResolver = new OrderedContractResolver()
               };

string listJons = JsonConvert.SerializeObject(item.Value,settings);


public class OrderedContractResolver : DefaultContractResolver
{
    protected override System.Collections.Generic.IList<JsonProperty> CreateProperties(System.Type type, MemberSerialization memberSerialization)
    {
        return base.CreateProperties(type, memberSerialization).OrderBy(p  => p.PropertyName).ToList();
    }
}