2

我有一个相当大的对象图,我已通过 DataContractSerializer 将其序列化为一个文件。我现在想向用户展示这些文件的列表以供选择。在此列表中,我想显示有关文件的一些详细信息,它们是根对象的属性。我不想将整个图形加载到内存中,因为我只对显示根节点的属性感兴趣。

有谁知道控制反序列化“深度”的方法,这样我就可以从文件中提取根对象并跳过子对象?我宁愿避免将文件视为原始 XML,因为我没有在其他任何地方进行任何原始 XML 操作,这将是我必须保持同步的另一个代码分支。

我现在唯一的想法是创建一个兼容的“摘要”对象,其中只包含我感兴趣的属性,而不包含任何子对象,并将文件反序列化为该对象。这应该跳过孩子,因为它们与摘要对象无关。

有没有更好的方法来实现这一点?

更新/澄清:属性不是我正在寻找的答案。一方面,当对象第一次序列化时,它们会阻止“额外”属性出现在文件中。

其次,它们比我想要做的更持久。最终,我确实想反序列化整个文件,但不是在这一点上。我正在尝试显示用户将从中选择导入的文件的摘要列表。在导入期间,我将需要所有的子孙。在第 1 步中这只是矫枉过正。这些文件可能是大文件,因此完全反序列化其中的几个以便我可以显示它们的标题信息是行不通的。

希望这可以消除对原始问题的任何困惑。

4

3 回答 3

1

这几乎就是您想要的方式。DataContractSerializer 旨在处理这种情况,在这种情况下,您必须使用概念上相同的类型,但从 CLR 的角度来看,您希望将它们序列化为不同的类型。

鉴于此,只需创建具有您想要序列化的类似属性子集的对象,并将该类型传递给 DataContractSerializer。

确保在您设置 DataContract 属性(以及您公开的子项上的任何 DataMember 属性或 DataContract 属性)的属性的“摘要”类型上,特别是 Name 和 Namespace 属性以反映非摘要类型(因为这些必须匹配)。

于 2009-01-05T15:56:44.143 回答
1

如果您只想从根节点中提取一些细节,我的第一个建议是进行 XML 操作。尽管我不知道性能影响,但另一种可能性是使用 DataContractSerializer 的版本控制功能来解决这个问题。在您的数据合同上,将除摘要中需要的字段之外的每个字段标记为可选。然后,将数据协定复制为另一个类,省略可选字段。反序列化为新的、更小的数据合约。

class Program
{
    static void Main(string[] args)
    {
        Person a = new Person();
        Person b = new Person();
        a.Name = "Mike";
        b.Name = "Joe";
        b.Parent = a;

        DataContractSerializer dtc = new DataContractSerializer(typeof(Person));

        StringBuilder sb = new StringBuilder();
        using (XmlWriter xr = XmlWriter.Create(sb))
        {
            dtc.WriteObject(xr, b);
        }

        object n;

        DataContractSerializer dtc2 = new DataContractSerializer(typeof(TinyPerson));

        using (XmlReader xr = XmlReader.Create(new StringReader(sb.ToString())))
        {
            n = dtc2.ReadObject(xr);
        }

    }
}

[DataContract(Name="Person")]
public class Person
{
    [DataMember]
    public string Name;

    [DataMember(IsRequired=false)]
    public Person Parent; 
}


[DataContract(Name = "Person")]
public class TinyPerson
{
    [DataMember]
    public string Name;

}
于 2009-01-05T16:54:39.177 回答
-2

您可以通过使用属性来控制序列化。在这里阅读更多

于 2009-01-05T15:18:15.220 回答