繁体   English   中英

DataContractSerializer不反序列化引用

DataContractSerializer not deserializing references

提示:本站收集StackOverFlow近2千万问答,支持中英文搜索,鼠标放在语句上弹窗显示对应的参考中文或英文, 本站还提供   中文繁体   英文版本   中英对照 版本,有任何建议请联系yoyou2525@163.com。

我使用.NET 3.5中的DataContractSerializer来反序列化xml。 xml之前是从实体模型中的一组相关实体序列化的,由实体框架3.5支持。 有许多引用,xml广泛地包含每个引用实体的成员和键的所有值。

顶级实体反序列化很好,但引用的实体不反。

这是我用来序列化和反序列化的代码:

    public static T DCDeserializeXml<T>(string xml)
    {
        MemoryStream memoryStream = new MemoryStream(Encoding.Unicode.GetBytes(xml));
        using (
        XmlDictionaryReader reader = XmlDictionaryReader.CreateTextReader(memoryStream, Encoding.Unicode,
                   new XmlDictionaryReaderQuotas(), null))
        {
            DataContractSerializer dataContractSerializer = new DataContractSerializer(typeof(T), null, Int32.MaxValue, false, true, null);
            return (T)dataContractSerializer.ReadObject(reader, true);
        }
    }

    public static string DCSerializeToXml<T>(T obj)
    {
        DataContractSerializer dataContractSerializer = new DataContractSerializer(typeof(T), null, Int32.MaxValue, false, true, null);

        String text;
        using (MemoryStream memoryStream = new MemoryStream())
        {
            dataContractSerializer.WriteObject(memoryStream, obj);                
            byte[] data = new byte[memoryStream.Length];
            Array.Copy(memoryStream.GetBuffer(), data, data.Length);
            text = Encoding.UTF8.GetString(data);
        }
        return text;
    }

这是XML的片段:

<?xml version="1.0" encoding="utf-8"?>
<Assets>
    <Asset z:Id="i1" xmlns="http://schemas.datacontract.org/2004/07/XLayer" xmlns:i="http://www.w3.org/2001/XMLSchema-instance" xmlns:z="http://schemas.microsoft.com/2003/10/Serialization/">
        <EntityKey z:Id="i2" xmlns="http://schemas.datacontract.org/2004/07/System.Data.Objects.DataClasses" xmlns:a="http://schemas.datacontract.org/2004/07/System.Data">
            <a:EntityContainerName>XModelContainer</a:EntityContainerName>
            <a:EntityKeyValues>
                <a:EntityKeyMember>
                    <a:Key>AssetGUID</a:Key>
                    <a:Value i:type="z:guid">7424f615-43db-4834-b15a-5befa46bfd55</a:Value>
                    </a:EntityKeyMember></a:EntityKeyValues>
                    <a:EntitySetName>AssetSet</a:EntitySetName>
                    </EntityKey>
                    <AssetGUID>7424f615-43db-4834-b15a-5befa46bfd55</AssetGUID>
                    <Created>2011-06-23T13:34:12.893</Created>
                    <Description/>
                    <npAudioInfoReference xmlns:a="http://schemas.datacontract.org/2004/07/System.Data.Objects.DataClasses">
                        <a:EntityKey i:nil="true" xmlns:b="http://schemas.datacontract.org/2004/07/System.Data"/>
                    </npAudioInfoReference>
                    <npCampaigns/>
                    <npCategory z:Id="i3">
                        <EntityKey z:Id="i4" xmlns="http://schemas.datacontract.org/2004/07/System.Data.Objects.DataClasses" xmlns:a="http://schemas.datacontract.org/2004/07/System.Data">
                            <a:EntityContainerName>XModelContainer</a:EntityContainerName>
                            <a:EntityKeyValues>
                                <a:EntityKeyMember>
                                    <a:Key>CategoryID</a:Key>
                                    <a:Value i:type="b:int" xmlns:b="http://www.w3.org/2001/XMLSchema">1</a:Value>
                                </a:EntityKeyMember>
                            </a:EntityKeyValues>
                            <a:EntitySetName>AssetCategorySet</a:EntitySetName>
                        </EntityKey>
                        <AM_DataDocumentTypes/>
                        <CategoryID>1</CategoryID>
                        <CategoryName>Generic Content</CategoryName>
                        <npAssets>

我已经被困在这几天了,我已经筋疲力尽了所有我能找到的搜索结果。 使用这种技术可以清楚地避免在我们的模型中为每个实体类型编写大量代码,其中有143个。

重申一下,顶级实体反序列化很好,但引用的实体却没有。 因此,在反序列化之后,资产被加载并且Asset.AssetCategory(以及更多)解析为null,我需要帮助来修复它,以便所有引用都被实例化。 拜托,有人吗?

1 个回复

有时你需要告诉序列化器其他“已知类型”。

请参阅MSDN文档:

http://msdn.microsoft.com/en-us/library/ms730167.aspx

您可以通过配置,通过属性或通过DataContractSerializer上的参数/属性来执行此操作。

这里有文档链接的完整示例:

http://msdn.microsoft.com/en-us/library/ms751512.aspx

2 DataContractSerializer,派生类型不反序列化基类型属性

我曾经有一个使用DataContractSerializer序列化和反序列化的JobData类; 我已经将JobData一些属性重构为BaseData因此可以在其他派生类中使用它们。 现在,当我反序列化对象时,只有保留在JobData中的属性被反序列化,而BaseData中的属性BaseDa ...

3 DataContract Serializer不会反序列化列表

我正在尝试使用datacontract序列化程序将以下XML反序列化为一个类。 我的DataContract类的代码是 我不能在这里弄清楚为什么此代码不反序列化列表或成员目标的问题。 如果carePlan类中只有一个memberGoal类,则工作正常,但对于列表而言失败。 ...

5 RestSharp不反序列化

由于某些原因,RestSharp不会反序列化响应: 我确认Web API返回有效结果。 response对象具有: 内容:{“ LocationID”:3,“ PrintName”:“ MyCountry”,“ ISO3166_1_alpha3”:“ XXX”} 状态码:确 ...

6 XML不反序列化

我正在尝试反序列化XML文件。 我写了文件的类结构。 当我尝试反序列化时,出现此错误: System.Xml.dll中发生了类型为'System.InvalidOperationException'的未处理异常。其他信息:XML文档(0,0)中存在错误。 我不知道类结构有什 ...

7 Json String不反序列化

我有以下JSON: 我试图用以下方法对其进行反序列化: 课程如下: 我尝试不使用属性和其他教程,但似乎没有任何工作.. =( 为什么不起作用? 例如,我不知道如何将return设置为root。 可能吗? 谢谢。 ...

8 JSON不反序列化

这是我第一次尝试WCF / JSON。 我创建了WCF Web服务。 这是我的方法之一。 这就是我将datable序列化为JSON的方式。 这将返回一个不错的JSON数据集: {“ GetPrayersResult”:“ [{\\” prayerid \\“:2,\\” ...

9 字典不反序列化

我遇到了一个问题,即我的项目中的一个词典未序列化或未反序列化。 反序列化后,我序列化的数据根本不在对象中。 这是要序列化的类的相关片段: 注意,这是二进制序列化。 项目中的其他所有内容都正确地序列化和反序列化。 ...

10 HttpClient ReadAsAsync不反序列化

我不确定我遇到的问题是否与我使用Task的方式有关,或者我是否未正确使用ReadAsAsync。 我正在遵循在这里找到的模式: http://blogs.msdn.com/b/henrikn/archive/2012/02/11/httpclient-is-here.aspx 背景 ...

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2022 STACKOOM.COM