我有这段代码:
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
添加这些属性(它是一个库)。
那么,我该如何解决这个问题?
答案 0 :(得分:2)
我无法编辑Google.GData.Client.AtomUri添加这些属性(它是一个库)。
然后你有两个选择:
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));
}