是否有一种方法来序列化嵌入对象使用json.net

本文关键字:对象 net json 序列化 方法 一种 是否 | 更新日期: 2023-09-27 17:54:13

我正在尝试使用JSON模拟外键行为。但我似乎找不到一种方法来获得真正的参考。

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

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();
        }

这里的问题是Console.WriteLine(jsonUsers[2].Group == jsonUsers[3].Group);总是假的。

我发现唯一能让它工作的方法是存储一个用户列表,然后是一个组列表,并在用户内部拥有一个GroupId属性。然后,在所有内容反序列化之后,我手动在用户内部插入组的引用。做作了。

解决这个问题的最好方法是什么?

是否有一种方法来序列化嵌入对象使用json.net

您正在进行实例比较。你应该覆盖EqualsGetHashcodeGroup类。操作符重载也很好,因为你在控制台使用==操作符。WriteLine

否则;

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

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

总是返回false

.

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();
    }
}