public static void CyclicSerialization() { // Ustvarimo tri vozlišča drevesa Node <string> root = new Node <string>() { Value = "startek" }; Node <string> leftSon = new Node <string>() { Value = "levi sinek" }; Node <string> leftleftSon = new Node <string>() { Value = "levi levi sinek" }; Node <string> rightSon = new Node <string>() { Value = "desni sinek" }; // Ciklična odvisnost po tipih ni problematična. root.Left = leftSon; root.Right = rightSon; leftSon.Left = leftleftSon; // Če pa dodamo ciklično odvisnost po instancah, naletimo na težavo. // Klicu serializacije moramo povedati, naj vodi reference na posamezne instance leftSon.Parent = root; rightSon.Parent = root; leftleftSon.Parent = leftSon; // S spodnjo nastavitvijo vsak objekt dobi svoj ID, po katerem ga serializator prepozna var serSettings = new DataContractSerializerSettings() { PreserveObjectReferences = true }; SerializationBasics.SerializeObject <Node <string> >(root, "root.xml", serSettings); SerializationBasics.SerializeObject <Node <string> >(leftSon, "leftSon.xml", serSettings); Console.WriteLine("Objekt je uspešno serializiran."); // Naredimo še deserializacijo Node <string> newRoot = SerializationBasics.DeserializeObject <Node <string> >("root.xml"); Console.WriteLine($"Objekt je uspešno deserializiran: {newRoot.Value}"); // Podobno kot s cikli lahko upravljamo z instancami abstraktnih razredov ali vmesnikov }
static void Main(string[] args) { switch (InterfaceFunctions.ChooseSection <SerializationSections>()) { case SerializationSections.Serialize: SerializationBasics.Serialize(); break; case SerializationSections.Deserialize: SerializationBasics.Deserialize(); break; case SerializationSections.Cyclic: CyclicDependencies.CyclicSerialization(); break; } Console.ReadLine(); }
static void Main(string[] args) { Section section = Section.Cyclic; switch (section) { case Section.Serialize: SerializationBasics.Serialize(); break; case Section.Deserialize: SerializationBasics.Deserialize(); break; case Section.Cyclic: CyclicDependencies.CyclicSerialization(); break; } Console.ReadLine(); }