1

我有这个代码:

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添加这些属性(它是一个库)。

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

4

2 回答 2

2

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

那么你有两个选择:

  • 编写一个单独的可序列化的 DTO 层;这通常是微不足道的,并且在遇到任何序列化程序问题时几乎总是我的首选路线。含义:编写您自己的一组类型,这些类型看起来与GData类大致相似,以适合您选择的序列化程序的方式装饰和构造 - 并编写几行代码在它们之间进行映射
  • 使用构造函数的多个重载之一DataContractSerializer来指定附加信息;坦率地说,这通常只会让你进入一个复杂的迷宫,在笨拙的代码中越来越多地告诉它,直到它几乎可以工作;DTO 更易于维护
于 2013-03-11T13:37:24.080 回答
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));
}
于 2013-03-11T14:28:39.747 回答