我有一個應用程序將對象列表序列化爲json,然後通過套接字連接將其發送到客戶端。使用PopulateObject來填充列表而不重複條目
在客戶端,我使用JsonConvert.PopulateObject()來使用新接收的json數據填充對象的現有列表。但是,如果有任何重複,這些對象將不斷地追加到列表中,而不是重新使用列表中的現有對象。
這裏是我序列化類/解串:
public class Process : INotifyPropertyChanged
{
private int _id;
private string _name;
public int ID
{
get { return _id; }
set
{
if (value != _id)
{
_id = value;
NotifyPropertyChanged("ID");
}
}
}
public string Name
{
get { return _name; }
set
{
if (value != _name)
{
_name = value;
NotifyPropertyChanged("Name");
}
}
}
public Process() { }
public Process(int id, string name)
{
ID = id;
Name = name;
}
public event PropertyChangedEventHandler PropertyChanged;
protected void NotifyPropertyChanged(String propertyName)
{
PropertyChangedEventHandler handler = PropertyChanged;
if (null != handler)
{
handler(this, new PropertyChangedEventArgs(propertyName));
}
}
}
這裏是我使用的代碼PopulateObject:
JsonSerializerSettings settings = new JsonSerializerSettings() { PreserveReferencesHandling = PreserveReferencesHandling.Objects, ObjectCreationHandling = ObjectCreationHandling.Auto };
ObservableCollection<Process> Processes = new ObservableCollection<Process>();
JsonConvert.PopulateObject(response, Processes, settings);
好像json.net只是不知道盡管屬性值完全相同,但對象仍然是重複引用。我試過我的類的JsonObject屬性的多個組合(IsReference = true,Id =「ID」)等。我似乎無法讓json識別兩個對象是相同的,如果他們的ID屬性匹配。
你是不是也用'PreserveReferencesHandling = PreserveReferencesHandling.Objects'序列化數據時在客戶端設置?如果你想保留引用,這是必須的 - 它通過在JSON中編寫特殊的'$ id'和'$ ref'屬性來工作,以幫助解序列化。有關詳細信息,請參閱@ Plutonix的答案。 –