代码之家  ›  专栏  ›  技术社区  ›  EAX

C语言中的递归序列化#

  •  4
  • EAX  · 技术社区  · 9 年前

    我需要序列化 myFamily 我真的不知道该怎么做。

    枚举.cs

    public enum Genre {
        Male,
        Female
    }
    

    个人.cs

    public class PERSON {
        public string Name { get; set; }
        public Genre Genre { get; set; }
        public List<PERSON> Parents { get; set; }
        public List<PERSON> Children { get; set; }
    
        public PERSON(string name, Genre genre) {
            this.Name = name;
            this.Genre = genre;
        }
    }
    

    表格1.cs

        private void Form1_Load(object sender, EventArgs e) {
            List<PERSON> myFamily = new List<PERSON>();
    
            PERSON Andrew = new PERSON("Andrew", Genre.Male);
            PERSON Angela = new PERSON("Angela", Genre.Female);
            PERSON Tina = new PERSON("Tina", Genre.Female);
            PERSON Jason = new PERSON("Jason", Genre.Male);
            PERSON Amanda = new PERSON("Amanda", Genre.Female);
            PERSON Steven = new PERSON("Steven", Genre.Male);
    
            Andrew.Parents.Add(Tina);
            Andrew.Parents.Add(Jason);
    
            Angela.Parents.Add(Tina);
            Angela.Parents.Add(Jason);
    
            Tina.Parents.Add(Amanda);
            Tina.Parents.Add(Steven);
    
            Jason.Children.Add(Andrew);
            Jason.Children.Add(Angela);
    
            Tina.Children.Add(Andrew);
            Tina.Children.Add(Angela);
    
            Amanda.Children.Add(Tina);
    
            Steven.Children.Add(Tina);
    
            myFamily.Add(Andrew);
            myFamily.Add(Angela);
            myFamily.Add(Tina);
            myFamily.Add(Jason);
            myFamily.Add(Amanda);
            myFamily.Add(Steven);
    
            // serialize to an .xml file
        }
    
    1 回复  |  直到 9 年前
        1
  •  4
  •   Reza Aghaei    9 年前

    要使用循环引用序列化对象,需要使用 DataContractSerializer 。这样做

    • 添加 [DataContract(IsReference=true)] Person
    • 添加 [DataMember] 到您的财产
    • 在构造函数中实例化列表
    • 记住 using System.Runtime.Serialization;

    所以你的课程应该是:

    [DataContract(IsReference=true)]
    public class PERSON
    {
        [DataMember]
        public string Name { get; set; }
        [DataMember]
        public Genre Genre { get; set; }
        [DataMember]
        public List<PERSON> Parents { get; set; }
        [DataMember]
        public List<PERSON> Children { get; set; }
    
        public PERSON(string name, Genre genre)
        {
            this.Name = name;
            this.Genre = genre;
            Parents = new List<PERSON>();
            Children = new List<PERSON>();
        }
    }
    

    要序列化:

    var serializer = new DataContractSerializer(myFamily.GetType()); 
    using (FileStream stream = File.Create(@"D:\Test.Xml")) 
    { 
        serializer.WriteObject(stream, myFamily); 
    } 
    

    要反序列化:

    using (FileStream stream = File.OpenRead(@"D:\Test.Xml"))
    { 
        List<PERSON> data = (List<PERSON>)serializer.ReadObject(stream); 
    }