【发布时间】:2012-12-04 02:21:36
【问题描述】:
我今天开始在 WCF 反序列化中遇到错误 - 代码一直没有改变并且工作了几个月。
问题是我在运行时 XmlExceptions 说“名称不能以 '<MyProperty>k_BackingField,这就是 XmlException 的来源。
我在网上看到了其他一些参考资料,人们接受的解决方案是“我将代码更改为不使用自动属性”,这对我来说并不是真的可以接受,因为我需要更改 100 多个对象, (其中有 1000 多处房产)。此外,当我上周运行它时,同样的代码运行良好,并且似乎不会影响所有序列化的 DTO,只会影响一些。
更令人沮丧的是,它似乎有点断断续续。有时今天早上,没有抛出异常......!
问题;
- 为什么在未更改代码和未更改框架源时会突然出现此问题?
- 如何在不修改所有 DTO 以使用完全实现的属性的情况下解决此问题?
更新:在正常工作一天左右后,这个问题再次出现 - 我找不到为什么它会工作/不工作/再次工作的原因,但我们到了。
我已进一步追踪问题与我在 ServiceContracts 上使用 ServiceKnownType 属性的一些代码相关,该属性用于定义序列化的已知类型。似乎虽然报告错误的类型甚至不是我当时正在进行的服务调用的一部分,但此错误发生在作为此已知类型“发布”行为的一部分的类型上。
当我使用一些代理创建代码来应用一些服务行为时,就会出现问题;
IOperationBehavior innerBehavior = new PreserveReferencesOperationBehavior(
description, this.preserveReferences, this.maxItemsInObjectGraph);
innerBehavior.ApplyClientBehavior(description, proxy);
我无法调试 ApplyClientBehavior 代码,因为它是 System.ServiceModel 的一部分(或者我可以吗?),但该方法中的某些内容试图验证我使用 ServiceKnownType 属性发布的所有类型,然后继续其中一些是XmlException。我不知道为什么某些类型会失败 - 并且仅针对它们的 一些 属性。
这是针对它们报告错误的类型的示例;
[Serializable]
public class MyDataObject
{
public ActivitySession(string id)
{
this.Id = id;
this.IsOpen = true;
}
public string Id { get; set; }
public bool IsValid { get; set; }
}
异常针对Id报错-><Id>k_BackingField cannot start with '<'
所以在那个类中没有什么争议,也没有需要考虑的继承。它甚至不是服务合同的一部分,只是它以前作为已知类型发布以进行序列化。
现在这个问题越来越深奥了,所以我不期待答案,只是更新问题所在。
【问题讨论】:
-
你能发布一个示例数据合同吗?
-
我将尝试将其进一步隔离到问题发生的位置。目前决定再开工了……:-(
-
已将此问题更新为最新版本,因为该问题再次出现。我进一步隔离了为什么某些类型被报告为错误...
标签: c# wcf serialization .net-4.0 xmlexception