I have a set of classes like the following:
public class Class1 : IClass
{
public List<Class2> Class2List { get { return Class3Instance.Class2List; } }
public Class3 Class3Instance { get; set; }
}
public class Class2
{
public string Field1 { get; set; }
public int Field2 { get; set;}
}
public class Class3
{
public List<Class2> Class2List { get; set; }
}
I am storing information about a list of Class1 and the serialization of said list works as expected i.e. the resulting file contains all the information I serialized it with.
When I deserialize though, there's a problem although no exceptions are given and I can read information, there's extra information being added to Class3.
Class3 is a class which is used in my application as a list of Class3 instances for its lifetime, I also use it to query information about other fields as needed in the application flow that are not relevant to this issue.
The thing is, when I read a list of Class1 with 1 or more items in Class2List, I see that those items are being added to the Class2List property of the Class3 that is related to Class1.
If more than 1 element in the list of Class1 references the same Class3 instance, all of the Class2List members are added to the referenced Class3.
I do not know why this is happening of what I am doing wrong for this behaviour to happen, but I've found that marking the field Class2List as JsonIgnore solves this problem and I see no instances of Class1.Class2List being added to Class3.Class2List.
Could anyone explain to me why the behaviour I've described actually happens? I am lost as to why it does.
To Provide an example, serializing with the last version of Newtonsoft.Json the result of the following code:
Class3 class3 = new Class3();
class3.Class2List2 = new List<Class2>();
class3.Class2List2.Add(new Class2() { Field1 = "Member1", Field2 = 1 });
class3.Class2List2.Add(new Class2() { Field1 = "Member2", Field2 = 2 });
class3.Class2List2.Add(new Class2() { Field1 = "Member3", Field2 = 3 });
class3.Class2List2.Add(new Class2() { Field1 = "Member4", Field2 = 4 });
class3.Class2List2.Add(new Class2() { Field1 = "Member5", Field2 = 5 });
Class1 class1 = new Class1();
class1.Class3Instance = class3;
Gives this Json:
{
"Class3Instance": {
"Class2List2": [
{
"Field1": "Member1",
"Field2": 1
},
{
"Field1": "Member2",
"Field2": 2
},
{
"Field1": "Member3",
"Field2": 3
},
{
"Field1": "Member4",
"Field2": 4
},
{
"Field1": "Member5",
"Field2": 5
}
]
},
"Class2List": [
{
"Field1": "Member1",
"Field2": 1
},
{
"Field1": "Member2",
"Field2": 2
},
{
"Field1": "Member3",
"Field2": 3
},
{
"Field1": "Member4",
"Field2": 4
},
{
"Field1": "Member5",
"Field2": 5
}
]
}
Then, if I inmediately deserialize the JSON and serialize it again, I get the following result:
{
"Class3Instance": {
"Class2List2": [
{
"Field1": "Member1",
"Field2": 1
},
{
"Field1": "Member2",
"Field2": 2
},
{
"Field1": "Member3",
"Field2": 3
},
{
"Field1": "Member4",
"Field2": 4
},
{
"Field1": "Member5",
"Field2": 5
},
{
"Field1": "Member1",
"Field2": 1
},
{
"Field1": "Member2",
"Field2": 2
},
{
"Field1": "Member3",
"Field2": 3
},
{
"Field1": "Member4",
"Field2": 4
},
{
"Field1": "Member5",
"Field2": 5
}
]
},
"Class2List": [
{
"Field1": "Member1",
"Field2": 1
},
{
"Field1": "Member2",
"Field2": 2
},
{
"Field1": "Member3",
"Field2": 3
},
{
"Field1": "Member4",
"Field2": 4
},
{
"Field1": "Member5",
"Field2": 5
},
{
"Field1": "Member1",
"Field2": 1
},
{
"Field1": "Member2",
"Field2": 2
},
{
"Field1": "Member3",
"Field2": 3
},
{
"Field1": "Member4",
"Field2": 4
},
{
"Field1": "Member5",
"Field2": 5
}
]
}
As you can see, the Class2List members have been duplicated when I deserialized the JSON.