在C#中,我希望序列化一个数据结构,其中对象可以属于多个集合。
例如,我有一个Person类。我还有一个Family类和School类,每个类都包含一个MemberList。 Person类的实例可以出现在Family的MemberList和School中。
我希望序列化整个数据结构,但我担心Person类的实例最终将被存储为两个单独的实例,并且在反序列化时,我将最终得到两个实例而不是一个实例。串行器是否足够聪明地存储数据以便不会发生这种情况?有没有办法阻止这种情况发生呢?
任何帮助或建议表示赞赏。
答案 0 :(得分:1)
据我所知,它将序列化整个对象图 - 因此对象实例将被复制。自定义序列化是唯一的选择,可以手动或通过覆盖对象的默认序列化 - 两者都涉及。
我不会太担心它,直到它成为一个问题。第一步可以将整个图表序列化。
答案 1 :(得分:0)
您可以使用DataContractSerializer(由WCF使用)并使用DataContract属性和'IsReference'属性设置为true来装饰每个类(Family和School),如下所示:
[DataContract(IsReference=true)]
public class Family
{
// ...
}
这将告诉DataContractSerializer在反序列化时重新创建对象图时保持引用不变。
您可以使用DataContractSerializer将对象'objectInstance'序列化为流,如下所示:
using (var stream = new MemoryStream())
{
var serializer = new DataContractSerializer(objectInstance.GetType());
serializer.WriteObject(stream, objectInstance);
// The object has now been serialized to the stream
// Do something with the stream here.
}
请注意,您实际上不必使用WCF,您只需使用DataContractSerializer来序列化/反序列化对象图。
您可以在MSDN here上详细了解此属性。
另外,here is a basic example如何使用'IsReference'属性。