问题标签 [iserializable]
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.
asp.net-mvc - 在使用 AppFabric 缓存的 MVC SessionState 中使用 WCF DataContract
我有一个数据访问层、一个服务层和一个表示层。表示层是 ASP.NET MVC2 RTM(Web),服务层是 WCF(服务)。这都是 .NET 3.5 SP1。
问题是在服务中,被返回的对象被标记了[DataContract]
属性。Web 使用 AppFabric 缓存(又名 Velocity)SessionStateProvider 来存储会话状态。因此,我存储在会话中的任何内容都必须是可序列化的。
问题来了:DataContracts 没有标记,[Serializable]
据我所知,通过将它引入一个已经标记有[DataContract]
一些问题的类会出现,所以我不相信这是一个解决方案。
我最初计划在 Web 层中使用 DataContracts,将它们用作与渲染 DataContracts 相关的视图的模型(可能嵌套在更高级别的 ViewModel 类中)。但是由于会话状态提供程序要求存储在其中的所有对象都是可序列化的,我开始重新考虑这种策略。不过最好有,因为它们包含使用IDataErrorInfo
接口的验证逻辑,并且相同的验证逻辑可以在 MVC 中作为模型绑定的一部分重用。
您认为让我减少所需工作的最佳方法是什么?
我目前想到了以下不同的方法:
A. 在 Web 项目中创建一个“ServiceIntegration”部件。
这将是我的控制器和我的 WCF 服务层之间的中间人。ServiceIntegration 部分将使用 DataContracts 与服务层通信,并使用 ViewModels 与 Web 层通信,但必须使用双向 Transformer 在 DataContracts 和 ViewModels 之间进行转换。
此外,由于 IDataErrorInfo 验证不可重用,因此也有必要为每个 DataContract 创建一个验证器,它使用 Transformer 从 ViewModel 转换为 DataContract,使用 IDataErrorInfo 执行验证并返回其结果。这将在控制器的动作方法中使用(例如if (!MyValidator.IsValid(viewModel)) return View();
)
需要不同的类:xDataContract、xViewModel、xTransformer、xValidator
B. 在 web 项目中创建一个 'SessionIntegration' 部分
这将是控制器(或访问会话的任何东西)和会话本身之间的中间人。任何需要访问会话的东西都将通过这个类。DataContracts 将在整个应用程序中使用,除非它们被存储到会话中。SessionIntegration 部分负责将 DataContract 转换为某种 ISerializable 形式并返回。由于在 DataContract 上使用了 IDataErrorInfo 接口,因此不需要额外的验证器。
需要不同的类:xDataContract、xTransformer、xSerializableForm
注意:在这两种情况下仍然会有 ViewModels,但是使用 (B) 我可以从 DataContracts 组合 ViewModels。
(B) 的好处是不需要额外的验证器。
在我开始全面实施 (A)/(B) 之前,我想要一些反馈。目前,我开始倾向于(B),但是,(A)可能更灵活。无论哪种方式,对于它的价值来说,这似乎是太多的工作。有没有其他人遇到过这个问题,你同意/不同意我的观点,和/或你有其他解决问题的方法吗?
谢谢,
詹姆士
c# - 通过 WCF 传递递归集合
我想通过 WCF 方法传递一组相当通用的数据。数据基本上只是一组分层的键/值对,但它嵌套在任意级别。我最初考虑将它作为单个字符串传递并在任一端执行 XML 或 JSON 或类似的编码/解码,但由于 WCF 传输无论如何都是 XML 看起来有点傻,所以我希望有一种方法可以通过它“自然”。
该方法相当简单:
和:
这一切都编译得很好,但是当我尝试运行该服务时,它在 DataContract.GetStableName 下因 StackOverflowException 而崩溃。
我尝试[CollectionDataContract]
在类上放置一个属性DataTree
并明确指定所有名称,但这似乎没有任何区别。
我也尝试过[DataContract]
在它上面放一个,但是它甚至更早地失败了,因为Dictionary
is ISerializable
。
有任何想法吗?有一个更好的方法吗?
.net - 错误:“反序列化程序不知道映射到此合同的任何类型”?
我有一个类 Foo 标记[Serializable]
和实现ISerializable
。我正在尝试通过 DataContractSerializer 对其进行序列化。在 GetObjectData 我这样做:
它失败了:
元素“:Test”包含“http://schemas.microsoft.com/2003/10/Serialization/Arrays:ArrayOfint”数据合同的数据。反序列化器不知道映射到该合约的任何类型。将与“ArrayOfint”对应的类型添加到已知类型列表中 - 例如,通过使用 KnownTypeAttribute 属性或将其添加到传递给 DataContractSerializer 的已知类型列表中。
我尝试将knownTypes
arg 传递给 DataContractSerializer 构造函数 - 没有帮助。
.net - 在自定义序列化期间应该多久调用一次每个对象的 GetObjectData 方法?
我正在使用自定义序列化对我的应用程序中的数据进行序列化,即我存储的每个类都有[Serializable]
属性和实现ISerializable
。被序列化的对象图相当复杂,对象/类之间有很多交叉引用。序列化工作,但它很慢。:(
通过在每个相关类的方法中设置断点GetObjectData
,我发现我得到的命中数比得到的对象数多得多。
我很困惑——我对序列化框架的理解是它只会存储每个对象一次,即使对象图包含对它的多个引用。我假设这意味着每个对象的GetObjectData
方法在保存期间只需要调用一次。我错了吗?
如果是这样,我可以用这种方法做些什么来减少对我的类GetObjectData
方法的调用次数吗?
谢谢。
c# - 数组的反序列化总是给出一个空数组
我有一个自定义抽象基类,其中包含我使用 ISerializable 使其可序列化/可反序列化的子类。当我对此类的子类的单个实例进行序列化/反序列化时,一切正常。然而,当我做一个数组时,我总是在反序列化时得到一个空数组。序列化是使用 BinaryFormatter 完成的。
这些项目包含在一个:
在序列化时,这是在 SerializationInfo 参数的 GetObjectData 中完成的:
在反序列化时,这也是在序列化构造函数中的 SerializationInfo 参数上完成的:
反序列化总是给我一个空数组,正如我之前提到的,使用这段代码可以很好地序列化和反序列化单个项目:
序列化(GetObjectData 方法):
反序列化(序列化构造函数):
这是个常见的问题吗?至少我似乎没有发现任何其他人遇到它。希望有一个解决方案:) 如果我需要为您提供更多信息/代码,请告诉我。
谢谢!
silverlight - ISerializable 和 DataContract
使用 WCF 在 Silverlight 服务中,通常我们希望使用 DataContract 和 Datamember 属性来选择我们想要序列化的内容。这是我们向客户发送和从客户发送的内容。对于大多数事情来说,这从来都不是问题。
但是,我有一些我想与我的 silverlight 应用程序共享的类,“成熟”类,我想将它们发送给充满数据的客户端。这些类实现了 ISerializable,它在我更新时不喜欢与 WCF 服务配合使用。
我需要将 ISerializable 属性保留在那里,因为它正在其他地方使用一些旧代码。目前,我认为最好的选择是拥有一个新的类来传输数据,如果可能的话,我宁愿不必编写一个仅用于传输数据的类,但我认为这就是我将不得不做。
关于我可以做些什么来通过服务序列化并仍然能够将 ISerializable 标记保留在那里的任何想法?
drag-and-drop - 自定义对象类型的跨进程拖放包含 WinForms C# 中 XmlNodes 的排序列表
我遇到了与在以下位置发布的用户类似的问题:
幸运的是,我已经弄清楚如何序列化我的自定义对象的几乎所有部分,除了 SortedList 对象。
我需要这个对象,因为它包含一些对我的应用程序非常重要的信息,而且 Xml 嵌套非常混乱。
当我注释掉在 ISerializable 成员 GetObjectData() 中添加 SortedList 的行时,该对象会将其传递到新应用程序。当我把它留在里面时,它没有,而且我不知道如何让它序列化。
我在 StackOverflow 和网络上都做了一些查看,但没有发现任何用处。
我正在使用以下代码检查我的对象是否可序列化,以便可以将其拖放到另一个应用程序:
有没有人有任何可以帮助我的建议?如果可能的话,我想在拖放过程中保持我的 XmlNode 列表完整,但不反对进行一些额外的编码以将其分解为可序列化的部分并在另一侧重建它。重要的是最终结果必须包含一个 SortedList。
如有必要,如果有帮助,我可以提供我正在序列化的自定义对象的内容以进行拖放。
谢谢,
凯尔K。
datacontractserializer - 如何序列化 DbMetal 生成的类的实例?
我注意到 DbMetal 生成的类没有实现ISerializable
接口,也没有用DataContractAttribute
. 序列化此类类的最简单方法是什么?是否有任何 DbMetal 参数可以帮助我?
.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。
c# - ISerializable 反序列化性能
在实现 ISerializable 时,您编写这样的代码来执行自定义反序列化......
(注意:这是一个简单的例子,不保证自定义反序列化)。
GetValue 方法需要您希望反序列化的类型,根据智能感知帮助执行以下操作
“如果存储的值不能转换成这种类型,系统会抛出 System.InvalidCast 异常”
这是否意味着在我的示例语句中执行了两个强制转换?
另外,添加此类型参数有什么意义,因为如果我编写以下内容
...这无论如何都不会编译,因为您“无法将类型'object'隐式转换为'string'”。所以这意味着无论如何我都必须转换对象,因此如果转换无效,无论如何我都会通过我自己的转换获得 InvalidCastException 。
看起来这里发生了两次强制转换,同样在任何情况下都只能在运行时发生错误(没有可以通过泛型实现的编译类型检查),除非有人知道发生这种情况的原因吗?
更新:可能是在幕后使用“is”运算符来检查类型是预期的吗?“是”是否会自动尝试投射?