我有一个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
添加回反序列化对象(已经存在)时,它仍会添加到集合中。
不确定为什么会这样。 任何线索都会有所帮助。
答案 0 :(得分:0)
当我创建默认构造函数并初始化data
参数时,就会传递此内容。
public MyClass()
{
data = new HashSet<T>(new CustomComparer());
}
不确定这是否是实现此目的的正确方法。 因为将不必要地创建数据对象的多个实例。 有没有更好的方法来完成这项工作?
在参数化构造函数之上强加[JsonConstructor]
属性也不起作用。
注意:我从JsonProperty属性中删除了ObjectCreationHandling
属性。