问题标签 [netdatacontractserializer]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
658 浏览

c# - NetDataContractSerializer 和程序集版本不匹配

我正在使用NetDataContractSerializer在应用程序之间交换数据。当程序集版本不匹配时,我希望ReadObject方法引发异常。

现在,例如,当我从程序集版本 1.0.0.0 序列化我的对象,然后反序列化它具有相同的程序集但现在版本 1.0.0.1 时,NetDataContractSerializer愉快地吞下流并反序列化没有问题。

当版本不匹配时是否可以中止反序列化过程?

更新:由于许多原因,我需要版本不容忍。这既是客户的要求,也是绝对确定导入处理从相同版本的应用程序导出的文件的要求。在我的应用程序中,更改版本使之前的导入过程毫无用处,因为版本更改或多或少涉及到内部结构的更改。

0 投票
1 回答
953 浏览

c# - Dispose or not Dispose.. 通过导航器从 XmlDocument 创建的作者?

我真的需要在下面处理作家吗?

如果不是,则代码简化为:

0 投票
2 回答
481 浏览

wcf - wcf netdatacontractserializer 以枚举为键的异常序列化字典

我正在使用带有 WCF 的 NetDataContractSerialiser。这适用于我们所有被序列化的类型。但是,我正在调用的服务正在生成以下异常

格式化程序在尝试反序列化消息时抛出异常:

尝试反序列化参数http://tempuri.org/:xmlServiceObjIN时出错。InnerException 消息是“反序列化程序无法加载要反序列化的类型,因为类型 'System.Collections.Generic.EnumEqualityComparer'1[[GrantEd.Common.DomainModel.Code.Enums.enumFundingParameterContextKey, GrantEd.Common.DomainModel.Code, Version=14.0 .71.0,Culture=neutral,PublicKeyToken=null]]' 在程序集“mscorlib,版本=2.0.0.0,Culture=neutral,PublicKeyToken=b77a5c561934e089”中找不到。检查被序列化的类型是否与被反序列化的类型具有相同的合同,并且使用了相同的程序集。有关更多详细信息,请参阅 InnerException。

被序列化的类有一个属性定义为

枚举的声明是

这是在另一个程序集中定义的。

当我用 int 替换枚举时,类反序列化没有问题。任何想法为什么使用枚举会导致异常?

使用 NetDataContractSerializer 的原因是为了提供类型信息并避免使用 KnownType

0 投票
1 回答
1171 浏览

c# - MVC 反序列化错误

好的。这是我公司的客户门户,它是一个 MVC 2 项目。我们有一个后端 SAP 系统,门户从中提取数据。但它不会直接命中 SAP,它会向 VB 应用程序发送一个 xml 请求,该应用程序获取数据并将其以 xml 响应的形式发回。有一个接口IRequest,所有各种请求实现的例子都是CustomerNumberRequestCompanyNameRequest等等。这些都实现了方法ToXml顾名思义,它只是构建要发送的 xml。所有现有的请求都可以正常工作。(让我先说我继承了这个项目,而编写它的人不再和我们在一起)我现在正尝试发送请求以从 SAP 获取 Rep Groups。我基本上逐字复制了其他请求之一,进行了必要的调整以发送适当的请求。但它不断失败,出现我不明白的错误消息:

格式化程序在尝试反序列化消息时抛出异常:尝试反序列化参数 http://tempuri.org/:request时出错。InnerException 消息是“反序列化程序无法加载要反序列化的类型,因为在程序集“XXXXX.CustomerPortal.Domain,版本=1.0.0.0,文化=中性,PublicKeyToken=null”中找不到类型“XXXXX.CustomerPortal.Domain.RepGroupRequest” '。检查被序列化的类型是否与被反序列化的类型具有相同的合同,并且使用了相同的程序集。有关更多详细信息,请参阅 InnerException。

此错误发生在_communicationService.ProcessRequest(request);(如下所示)它没有进入ProcessRequest它只是尝试在NetDataContractSerializer此处创建的方法:

然后它就死了。这些是被调用的方法:

谁能告诉我这个错误信息告诉我什么?它说找不到类型,但类型应该是 IRequest (这就是它CreateSerializer被击中时所说的),它在整个过程中都被使用。我显然迷路了,请帮助!

0 投票
1 回答
1264 浏览

.net - 重构代码后使用 NetDataContractSerializer 反序列化的问题

我有一种情况,我正在使用 NetDataContractSerializer 序列化一些 .NET 对象,并将 XML 存储在数据库中,以此来记住应用程序中这些对象的状态。最近我刚刚遇到第一种情况,其中一些属性和类型名称的代码重构导致无法反序列化此 XML 数据。

到目前为止,我已经提出了两种不同的攻击计划,用于处理版本兼容性中断,例如使用 NetDataContractSerializer 本身提供的工具来控制反序列化或直接转换 XML。根据我的实验和研究,似乎可以使用自定义 SerializationBinder反序列化为不同的类型和属性名称/类型更改可以通过实现 ISerializable 或通过实现 ISurrogateSelector 和 ISerializationSurrogate 编写序列化代理来解决。不幸的是,这种首选机制还没有被淘汰,除非我可以显示,否则它似乎使用代理在序列化数据的版本之间移动是不可能的,这是由于Microsoft 一些无法解释的设计决定。微软的建议是在双方都使用相同的序列化,这完全违背了使用代理来帮助在类型名称更改或移动到不同的命名空间或程序集的情况下的目的。

要修复它,请使用相同的 NetDataContractSerializer 实例或也使用兼容的 SurrogateSelector 初始化的另一个实例。

这种解释与MSDN 文章相冲突,该文章说使用自定义绑定器替换类型以及处理序列化结构中的其他更改。

在反序列化期间,格式化程序会看到已设置了一个活页夹。由于每个对象都将被反序列化,格式化程序调用活页夹的 BindToType 方法,将格式化程序想要反序列化的程序集名称和类型传递给它。此时,BindToType 决定实际应该构造什么类型并返回该类型。

请注意,如果新类型通过 Serializable 自定义属性使用简单序列化,则原始类型和新类型必须具有完全相同的字段名称和类型。但是,该类型的新版本可以实现 ISerializable 接口,然后将调用其特殊构造函数,该类型可以检查 SerializationInfo 对象中的值并确定如何反序列化自身。

因此,要么我将能够让 NetDataContractSerializer 将我的 V1 XML 反序列化为我的 V2 类型,要么我将不得不手动转换 XML。如果有人可以证明 NetDataContractSerializer 的 SerializationInfo 在使用 ISerializable 或使用序列化代理时确实有效,这将是优秀的,或者至少比微软给出的解释更好,否则我可能会发布一个新问题来辩论最佳方式在 .NET 中直接转换旧的 XML。

更新 2011-08-16: 经过一些实验后,如果被序列化的原始类型实现 ISerializable,则 ISerializable 和序列化代理技术似乎都可以正常工作,否则如果该类型仅使用 [Serializable] 属性,则似乎对象中的每个字段graph 缺少一些额外属性形式的有价值的类型信息。

使用[Serializable]属性的示例

实现ISerialzable 的示例:

当使用带有自定义绑定器的 NetDataContractSerializer 来反序列化第一个示例以更改类型,然后在该类型上实现 ISerializable 或提供一个代理选择器来指定基本上满足 ISerializalbe 角色的序列化代理时,您将在 ISerializationSurrogate 中看到一个空的 SerializationInfo .SetObjectData 方法。在第二个示例中处理 xml 时,SerializationInfo 似乎获得了正确的信息,并且事情按预期工作。

我的结论是,NetDataContractSerializer 为仅通过 SerializableAttribute 支持序列化的类型生成的默认 XML 将与使用 ISerializable 或序列化代理技术的反序列化不兼容,因为缺少类型信息。因此,为了使 NetDataContractSerializable 的使用更具前瞻性,应该自定义序列化以确保 XML 中包含此类型信息,以便以后可以自定义反序列化,而无需手动转换源 XML。

0 投票
1 回答
6498 浏览

datacontractserializer - NetDataContractSerializer 与 DataContractSerializer

我们有一个应用程序,其中包含我们希望在数据库中保持序列化的对象。
目前我们正在使用NetDataContractSerializer,但最近发现由于涉及的.Net类型信息,它会创建巨大的文件,这意味着应用程序缓慢,即使对于基本对象也是如此。
我们正在考虑改用DataContractSerializer,我一直在寻找两者的一个很好的比较,但没有找到。

  • 两者创建的对象的大小有什么区别?
  • 有很大的性能差异吗?
  • 当我有一个包含 a 的对象时,它们中的任何一个是否有问题List<X>,其中X由多个其他对象继承,以便列表在运行时包含许多不同的类型?(有人告诉我DataContractSerializer可以赋予KnownTypes属性,但这意味着代码中有更多的依赖关系。有没有办法让DataContractSerializer我的解决方案中的所有类型都知道?)

谢谢。

0 投票
2 回答
816 浏览

.net - 嵌套数据的反序列化

我的第一次尝试和 JSON 反序列化,我被困住了,只是想知道您是否可以提供帮助?

我有以下 JSON

这是我的 C# 代码

而且我只对状态结果感兴趣,根本不关心。我做错了什么,因为它只为 RunningFor 返回 0。

提前致谢

0 投票
1 回答
265 浏览

c# - 对象删除错误后的序列化 (NetDataContractSerializer)

我正在使用 NetDataContractSerializer。我可以创建、添加对象并将其序列化到数据文件中没有问题;将文件重新加载到 GUI 中没有问题。

但是,当我尝试从数据中删除(删除)对象并重新保存(序列化)数据时遇到了问题。

这是我的删除房间按钮;当用户请求删除特定楼层的房间时,程序将创建驻留在该特定楼层的特定房间内的对象列表。然后删除它们,关闭他们正在查看的当前表单并保存数据。

这似乎可行,因为程序不会崩溃,并且房间已从当前楼层的房间列表中删除。

但是,当我尝试重新加载文件(关闭程序,打开并加载)时,我收到此错误:

“反序列化对象时出错。根级别的数据无效。第 1 行,第 1 位。”

这是我的 deleteRoom 按钮

这是我的方法deleteAsset()的 CRUD

这是我的持久性控制器

0 投票
1 回答
2901 浏览

c# - 反序列化 DataContract/Serializable 混搭时的可选属性

我有一个现有的代码库,它通过 将几个简单的类保存到磁盘NetDataContractSerializer,但不幸的是,这些类不是用 装饰的[DataContract],而是用[Serializable]. 这工作正常,但现在我想向持久类添加一些新属性,同时仍然能够读取旧版本生成的文件。

假设这是一个类:

现在,当我反序列化旧文件时,我得到一个异常,因为它们不包含NewProperty. 这是有道理的。所以我想NewProperty忽略,但是虽然有一个[OptionalField]属性可以让序列化程序忽略丢失的字段,但它不能应用于属性 - 只有字段。

所以我想我会使用[DataContract]and [DataMember],它也有一个IsRequired属性,但这会改变序列化文件的布局,并且它无法读取旧的数据文件。此外,您不能混合[Serializable]-[DataMember]如果序列化程序看到该[Serializable]属性,它会忽略[DataMember]指令。

那么,除非选择对旧文件进行一次性转换(可能,但不是我的第一选择),有没有办法让 NetDataContractSerializer 忽略现有 XML 序列化对象中的字段?

0 投票
1 回答
2642 浏览

.net - 紧凑框架 3.5 是否支持 System.Runtime.Serialization?

我正在编写一个库,它是一组旨在在许多不同的 .NET 应用程序之间共享的类,包括至少一个使用 .NET 紧凑框架的类。我一直在使这些类使用带有一堆 [DataMember] 的 [DataContract] 属性,以便使用 DataContractJSONSerializer 轻松序列化和反序列化它们。我一直在网上搜索以了解 .NET Compact Framework 3.5 是否支持此功能(DataContractAttribute、DataMemberAttribute 和 DataContractJsonSerializer),但我什至无法在.NET 框架。

有没有人碰巧知道对这些功能的支持程度?