0

我试图找到一种简单的方法来序列化任何对象,以便只包括直接属性及其“ToString”值。对于来自 DataContext 的对象,我希望能够忽略属性的属性(即,如果属性是复杂对象,也不要序列化该对象)。如果未加载属性,这一点尤其重要,因为它会导致错误“在释放对象后无法访问对象”...

我创建了以下内容,但是当它尝试访问未在原始 datacontext 调用中加载的属性时失败。

string typeString = o.GetType().Name;
        StringBuilder xml = new StringBuilder();
        xml.AppendFormat("<{0}>\r\n", typeString);

        foreach (PropertyInfo property in o.GetType().GetProperties())
        {
            var propertyValue = property.GetValue(o, null);
            if (property.GetType() != typeof(System.Data.Linq.Binary) && property.PropertyType.Name != "EntitySet`1" && property.GetCustomAttributes(typeof(XmlIgnoreAttribute), true).Count() == 0)
            {
                xml.AppendFormat("<{0}>{1}</{0}>\r\n", property.Name, propertyValue);
            }

        }

        xml.AppendFormat("</{0}>", typeString);

        return xml.ToString();
4

1 回答 1

1

您可以使用具有适当“忽略”属性的库存序列化程序,例如在您不希望序列化的属性上使用DataContractSerializerIgnoreDataMemberAttribute 。

如果您希望坚持您概述的方法,您可以检查 PropertyInfo.PropertyType以不对任何复杂类型采取行动。

您可以使用Type.IsPrimitive来查看给定类型是否为原始类型,但这里有一些陷阱:

https://stackoverflow.com/a/2442544/141172

于 2013-03-20T23:31:33.053 回答