DataContractSerializer无法找到引用?序列化Level类遇问题求助
排查DataContractSerializer找不到引用的问题
嘿,我看你在使用DataContractSerializer序列化Level类时遇到了找不到引用的问题,咱们一步步来排查:
首先,先把你提供的Level类代码整理完整(看起来你贴的Face和Edge类代码被截断了):
[DataContract] public class Level { [DataMember] public List<Face> faces; public Level() { Face a = new Face(); Face b = new Face(); Face c = new Face(); Face d = new Face(); a.edges.Add(new Edge(b, c)); b.edges.Add(new Edge(a, c)); c.edges.Add(new Edge(a, d)); d.edges.Add(new Edge(a, b)); this.faces = new List<Face>() { a, b, c, d }; } }
接下来,DataContractSerializer找不到引用的核心原因几乎都是参与序列化的嵌套类没有正确标记数据契约,咱们来逐个排查:
- Face和Edge类必须标记
[DataContract]:DataContractSerializer要求所有被序列化的类型(包括嵌套的自定义类)都显式添加[DataContract]特性,否则序列化器无法识别这些类型的结构,就会抛出找不到引用的错误。 - Face和Edge的成员需要标记
[DataMember]:比如Face类里的edges集合,Edge类里的两个Face引用(假设是类似public Face Face1 { get; set; }这样的成员),都需要添加[DataMember]特性,否则这些成员不会被序列化,也可能导致引用识别失败。 - 处理循环引用:你的代码里Face和Edge互相引用(Face包含Edge列表,Edge包含Face引用),这会形成循环引用。DataContractSerializer默认不处理循环引用,需要在
[DataContract]特性里添加IsReference = true,避免序列化时抛出异常。 - 确认程序集和命名空间:确保你已经引用了
System.Runtime.Serialization程序集,并且在代码顶部添加了using System.Runtime.Serialization;命名空间,否则[DataContract]和[DataMember]特性会无法识别,也会间接导致找不到引用的问题。
最后,给你一个完整的可序列化示例,你可以参考调整:
using System.Collections.Generic; using System.Runtime.Serialization; using System.IO; using System.Xml; [DataContract(IsReference = true)] public class Level { [DataMember] public List<Face> faces; public Level() { Face a = new Face(); Face b = new Face(); Face c = new Face(); Face d = new Face(); a.edges.Add(new Edge(b, c)); b.edges.Add(new Edge(a, c)); c.edges.Add(new Edge(a, d)); d.edges.Add(new Edge(a, b)); this.faces = new List<Face>() { a, b, c, d }; } } [DataContract(IsReference = true)] public class Face { [DataMember] public List<Edge> edges = new List<Edge>(); } [DataContract(IsReference = true)] public class Edge { [DataMember] public Face FaceA { get; set; } [DataMember] public Face FaceB { get; set; } public Edge(Face a, Face b) { FaceA = a; FaceB = b; } } // 序列化示例代码 public static void SerializeLevel(Level level, string filePath) { DataContractSerializer serializer = new DataContractSerializer(typeof(Level)); using (FileStream fs = new FileStream(filePath, FileMode.Create)) { using (XmlDictionaryWriter writer = XmlDictionaryWriter.CreateTextWriter(fs)) { serializer.WriteObject(writer, level); } } } // 反序列化示例代码 public static Level DeserializeLevel(string filePath) { DataContractSerializer serializer = new DataContractSerializer(typeof(Level)); using (FileStream fs = new FileStream(filePath, FileMode.Open)) { using (XmlDictionaryReader reader = XmlDictionaryReader.CreateTextReader(fs, new XmlDictionaryReaderQuotas())) { return (Level)serializer.ReadObject(reader); } } }
如果按照上面的调整后还是有问题,可以把具体的错误信息贴出来,这样能更精准地定位问题~
内容的提问来源于stack exchange,提问作者Mycom
相关产品推荐
相关产品推荐

