【问题标题】:Serialize Linq2Sql Object After DisposeDispose 后序列化 Linq2Sql 对象
【发布时间】:2013-03-21 07:47:17
【问题描述】:

我试图找到一种简单的方法来序列化任何对象,以便只包含 immediate 属性及其“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();

【问题讨论】:

    标签: xml linq linq-to-sql serialization datacontext


    【解决方案1】:

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

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

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

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

    【讨论】:

    • 我想避免使用“IgnoreDataMember”标记类。本质上,我想要传递给它的对象的快照,那么我将如何使用 PropertyType 过滤掉“复杂类型”,我需要说 where type = int,或 string,或.. 等?
    • 相应地更新了答案。
    • 这很棒。它也修复了数据上下文问题,尽管理想情况下我仍然可以使用“ToString”显示复杂类型的“加载”属性。但我会尽我所能。
    猜你喜欢
    • 2011-12-02
    • 1970-01-01
    • 1970-01-01
    • 2023-04-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-10
    • 1970-01-01
    相关资源
    最近更新 更多