WCF反序列化中的XmlException:"名称不能以'<'开头 - 在自动属性支持字段中

RJ *_*han 12 c# wcf serialization .net-4.0 xmlexception

我今天已经开始在WCF反序列化中遇到错误 - 代码已经保持不变并且工作了几个月.

问题是我正在运行时XmlException说"名称不能以'<'字符开头".我已经调试到.NET源代码,似乎错误是从WCF服务调用反序列化返回对象.这些对象是使用自动属性定义的,并且支持字段似乎给出了类似的名称<MyProperty>k_BackingField,这是XmlException的来源.

我在网上看到了其他几个参考文献,其中人们接受的解决方案是"我将我的代码更改为不使用自动属性",这对我来说是不可接受的,因为我会有100个对象需要更改,(1000s)其中的属性).此外,当我上周运行它时,这个相同的代码工作正常,并且似乎不会影响所有序列化的DTO,只有一些.

为了让它更令人沮丧,它似乎有点间歇性.今天早上有时候没有例外......!

问题;

  1. 为什么这个问题突然出现在未更改的代码和未更改的框架源中?
  2. 如何在不修改所有DTO以使用完全实现的属性的情况下解决此问题?

更新:经过一天左右的工作正常,这个问题再次出现 - 没有理由我可以找到它为什么会工作/不工作/再次工作,但在这里我们是.

我已经进一步跟踪问题,使用该ServiceKnownType属性与我在ServiceContracts上的一些代码相关,该属性用于定义序列化的已知类型.似乎虽然报告错误的类型甚至不是我当时正在进行的服务调用的一部分,但是这种错误发生在类型上,这些类型是这种已知类型的"发布"行为的一部分.

当我使用一些代理创建代码来应用某些服务行为时,会出现问题;

IOperationBehavior innerBehavior = new PreserveReferencesOperationBehavior(
    description, this.preserveReferences, this.maxItemsInObjectGraph);
innerBehavior.ApplyClientBehavior(description, proxy);
Run Code Online (Sandbox Code Playgroud)

我不能调试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; }
}
Run Code Online (Sandbox Code Playgroud)

异常报告错误Id- ><Id>k_BackingField cannot start with '<'

因此,在该课程中没有任何争议,也没有遗传可供考虑.它甚至不是服务合同的一部分,只是它以前作为序列化的已知类型发布.

现在这已经变得非常深奥了,所以我不期待一个答案,只是更新问题的所在.

RJ *_*han 10

我想我已经找到了更多的信息来帮助解释这个问题,(至少为什么错误只出现在某些类型上).

获得针对他们报告的异常的DTO是;

  • 作为我的[ServiceKnownType]属性的一部分发布
  • 标有 [Serializable]
  • 没有标记[DataContract]

[DataContract]属性添加到类型可以解决此问题.我不知道为什么,仍然不知道为什么这个错误是在间歇时,它发生,但一致的是什么它影响.