考虑使用DataContractAttribute属性标记它?

时间:2013-03-11 13:31:25

标签: c# .net serialization

我有这段代码:

IList<Type> lista = new List<Type>();
lista.Add(typeof(Google.GData.YouTube.YouTubeEntry));

using (FileStream writer = new FileStream("c:/temp/file.xml", FileMode.Create, FileAccess.Write))
{
    DataContractSerializer ser = new DataContractSerializer(videoContainer.GetType(), lista);
    ser.WriteObject(writer, videoContainer);
}

向我生成此异常:Type 'Google.GData.Client.AtomUri' cannot be serialized. Consider marking it with the DataContractAttribute attribute, and marking all of its members you want serialized with the DataMemberAttribute attribute. See the Microsoft .NET Framework documentation for other supported types.

我无法编辑Google.GData.Client.AtomUri添加这些属性(它是一个库)。

那么,我该如何解决这个问题?

2 个答案:

答案 0 :(得分:2)

  

我无法编辑Google.GData.Client.AtomUri添加这些属性(它是一个库)。

然后你有两个选择:

  • 写一个单独的DTO层, 可序列化;这通常是微不足道的,当遇到 任何 序列化程序的问题时,几乎总是我首选的路线。含义:编写一组类似于GData类的类型,它们以适合您所选序列化程序的方式进行修饰和构造 - 并编写一些代码行来映射它们之间
  • 使用DataContractSerializer构造函数的多个重载之一来指定其他信息;坦率地说,这通常会让你进入一个迷茫的迷宫,在尴尬的代码中越来越多地告诉它,直到只是作品; DTO更易于维护

答案 1 :(得分:1)

如果你要追踪的只是属性的值,你可以使用基本反射并显示它们。这将显示给定对象的所有属性值,包括迭代集合。不是世界上最好的代码,而是阅读对象的快速而又脏的解决方案。

static void ShowProperties(object o, int indent = 0)
{
    foreach (var prop in o.GetType().GetProperties(BindingFlags.Public | BindingFlags.Instance))
    {
        if (typeof(IEnumerable).IsAssignableFrom(prop.PropertyType) && prop.PropertyType != typeof(string))
        {
            Console.WriteLine("{0}{1}:", string.Empty.PadRight(indent), prop.Name);
            var coll = (IEnumerable)prop.GetValue(o, null);
            if (coll != null)
            {
                foreach (object sub in coll)
                {
                    ShowProperties(sub, indent + 1);
                }
            }
        }
        else
        {
            Console.WriteLine("{0}{1}: {2}", string.Empty.PadRight(indent), prop.Name, prop.GetValue(o, null));
        }
    }
    Console.WriteLine("{0}------------", string.Empty.PadRight(indent));
}