gpt4 book ai didi

c# - XmlSerializer 需要 XmlInclude 用于具有通用约束的公共(public)方法,如果在另一个程序集中键入并且要求该类型是可序列化的!

转载 作者:行者123 更新时间:2023-11-30 17:21:07 24 4
gpt4 key购买 nike

请考虑以下事项。您有一个要使用 XmlSerializer 序列化的类,该类具有带有类型约束的公共(public)泛型方法,其中类型位于不同的程序集中:

using BarStuff;

namespace FooStuff {
public class Foo {
...
public T GetBar<TBar, T>( string key ) where TBar : Bar<T> {
...
}
}
}

您不会期望 XmlSerializer 甚至关心自己的方法,通常它不会。以下两者都可以正常工作:

//private, serializer doesn't care about it
private T GetBar<TBar, T>( string key ) where TBar : Bar<T> {
...
}

//no generic type constraint, serializer also doesn't care about it
public Bar GetBar( string key ) {
...
}

此外,如果类型 Bar 与 Foo 在同一个程序集中,那么序列化程序也会非常满意。

当您执行第一个示例时,如果 Bar 是在单独的程序集中定义的,您将收到一个运行时异常,提示您需要添加对包含 Bar 的程序集的引用,即使您已经在您的程序中包含该程序集项目引用。您可以使用 XmlInclude 解决此问题:

[XmlInclude(typeof(Bar))]
public class Foo {
public T GetBar<TBar, T>( string key ) where TBar : Bar<T> {
...
}
}

但是,如果 Bar 不可序列化,而且没有理由它应该序列化,您现在将在它第一次遇到无法序列化的东西时得到一个运行时异常,例如返回一个接口(interface)作为它的公共(public)属性类型,没有无参数构造函数的类等!

相关但不那么详细:XmlSerializer is throwing InvalidOperationException when using the generic type constraint where

还有:Microsoft's take on the problem

最佳答案

一些解决方法:

  • 使用不同的序列化程序,例如 DataContractSerializer
  • 确保类型在同一个程序集中,这样就不需要 XmlInclude(讨厌)
  • 更改 Bar 使其可序列化(糟糕)
  • 避免使用这种方法,即仅序列化 DTO 类型对象并在其他地方使用任何此类功能
  • 这是偷偷摸摸的和骇人听闻的...包括一个虚拟类,它在与您的类型 Bar 相同的程序集中可序列化,然后 XmlInclude 代替它,这将使序列化程序满意,即:<

例子:

namespace BarStuff {
//the serializer is perfectly happy with me
public class DummyBar{}

//the serializer doesn't like me
public class Bar{
...
}

...
}

using BarStuff;
namespace FooStuff {
[XmlInclude(typeof(DummyBar))]
public class Foo {
public T GetBar<TBar, T>( string key ) where TBar : Bar<T> {
...
}
}

关于c# - XmlSerializer 需要 XmlInclude 用于具有通用约束的公共(public)方法,如果在另一个程序集中键入并且要求该类型是可序列化的!,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3714333/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com