0

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

ここでの問題は、それConsole.WriteLine(jsonUsers[2].Group == jsonUsers[3].Group);が常に false であることです。

私が見つけた唯一の方法は、ユーザーのリストを保存し、次にグループのリストを保存し、ユーザーの内部に GroupId プロパティを持つことです。次に、すべてが逆シリアル化された後、ユーザー内のグループの参照を手動で挿入します。ハックです。

この問題にアプローチする最良の方法は何ですか?

4

1 に答える 1

2

インスタンス比較を行っています。EqualsオーバーライドしGetHashcodeGroupクラスに入れる必要があります。==Console.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();
    }
}
于 2013-01-18T21:56:25.767 に答える