C# 有没有一种方法可以使用json.net序列化嵌入的对象

C# 有没有一种方法可以使用json.net序列化嵌入的对象,c#,.net,serialization,foreign-keys,json.net,C#,.net,Serialization,Foreign Keys,Json.net,我试图使用JSON.Net模拟外键行为,但似乎找不到一种方法来获得真正的引用 假设我有一个简单的例子: private static void Main(string[] args) { var g1 = new Group {Name = "g1"}; var g2 = new Group {Name = "g2"}; var users = new[] {

我试图使用JSON.Net模拟外键行为,但似乎找不到一种方法来获得真正的引用

假设我有一个简单的例子:

private static void Main(string[] args)
        {
            var g1 = new Group {Name = "g1"};
            var g2 = new Group {Name = "g2"};

            var users = new[]
            {
                new User{ Username = "truc", Group = g1 },
                new User{ Username = "machin", Group = g2 },
                new User{ Username = "dom", Group = g2 },
                new User{ Username = "boum", Group = g2 }
            };

            string json = JsonConvert.SerializeObject(users);

            var jsonUsers = JsonConvert.DeserializeObject<User[]>(json);

            Console.WriteLine(jsonUsers[2].Group == jsonUsers[3].Group);

            Console.ReadLine();
        }
private static void Main(字符串[]args)
{
var g1=新组{Name=“g1”};
var g2=新组{Name=“g2”};
var users=new[]
{
新用户{Username=“truc”,Group=g1},
新用户{Username=“machin”,Group=g2},
新用户{Username=“dom”,Group=g2},
新用户{Username=“boum”,Group=g2}
};
string json=JsonConvert.SerializeObject(用户);
var jsonUsers=JsonConvert.DeserializeObject(json);
Console.WriteLine(jsonUsers[2].Group==jsonUsers[3].Group);
Console.ReadLine();
}
这里的问题是
Console.WriteLine(jsonUsers[2].Group==jsonUsers[3].Group)始终为false

我发现的唯一可行的方法是存储一个用户列表,然后是一个组列表,并且在用户内部有一个GroupId属性。然后,在所有内容反序列化之后,我手动在用户内部插入组的引用。这很粗俗


解决此问题的最佳方法是什么?

您正在进行实例比较。您应该覆盖
类中的
等于
GetHashcode
。运算符重载也很好,因为您在Console.WriteLine中使用了
=
运算符

否则

new Group() { Name = "a" } == new Group() { Name = "a" }

将始终返回false


您使用标识符链接模型的建议与I4V提供的答案一样也是一种有效的方法,特别是当序列化内容要传播到另一个接口时,比如说作为RESTful web服务的结果。此外,如果您使用Resharper,它提供了一个上下文操作来覆盖您应该真正使用的平等成员,因为它提供了一个更好的替代I4V的post的方法。我会调查的。
new Group() { Name = "a" }.Equals(new Group() { Name = "a" })
public class Group
{
    public string Name;
    public int i;


    public static bool operator ==(Group a, Group b)
    {
        return a.Equals(b);
    }

    public static bool operator !=(Group a, Group b)
    {
        return !(a.Name == b.Name);
    }

    public override bool Equals(object obj)
    {
        var g = obj as Group;
        if (ReferenceEquals(this,g)) return true;
        return g.Name.Equals(Name);
    }

    public override int GetHashCode()
    {
        return Name.GetHashCode();
    }
}