反序列化后HashSet中的重复C#

时间:2018-02-21 21:53:42

标签: c# json.net deserialization hashset

我有一个HashSet,如下所示:

public name {get; set; }

[JsonProperty(ObjectCreationHandling = ObjectCreationHandling.Replace, TypeNameHandling = TypeNameHandling.Auto)]
public ICollection<T> data { get; set; }

public MyClass(string name)
{
    name = name;
    data = new HashSet<T>(new CustomComparer());
}

比较器看起来像:

public class CustomComparer: EqualityComparer<T>
{
    public override bool Equals(T x, T y)
    {
        return string.Equals(x.val, y.val, StringComparison.OrdinalIgnoreCase);
    }

    public override int GetHashCode(T obj)
    {
        return $"{obj?.val?.ToLowerInvariant()}-{obj?.val?.ToLowerInvariant()}".GetHashCode();
    }
}

现在,我有一个单元测试,我首先创建一个MyClass实例:

var obj1 = new MyClass("test");
obj1.data.Add(CustomObject1);
obj1.data.Add(CustomObject2);

我要做的下一步是对对象进行序列化和反序列化。

var jsonSerializerSettings = new JsonSerializerSettings();         
var serializedObject = JsonConvert.SerializeObject(obj1, jsonSerializerSettings);
var deserializedUserObject = JsonConvert.DeserializeObject<MyClass>(serializedObject, jsonSerializerSettings);

现在,当我尝试将CustomObject1添加回反序列化对象(已经存在)时,它仍会添加到集合中。

不确定为什么会这样。 任何线索都会有所帮助。

1 个答案:

答案 0 :(得分:0)

当我创建默认构造函数并初始化data参数时,就会传递此内容。

public MyClass()
{
    data = new HashSet<T>(new CustomComparer());
}

不确定这是否是实现此目的的正确方法。 因为将不必要地创建数据对象的多个实例。  有没有更好的方法来完成这项工作?

在参数化构造函数之上强加[JsonConstructor]属性也不起作用。

注意:我从JsonProperty属性中删除了ObjectCreationHandling属性。