Учтите следующее. У вас есть класс, который вы хотите сериализовать с помощью XmlSerializer, который имеет открытый универсальный метод с ограничением типа, где тип находится в другой сборке:
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 не сериализуем, и нет причин для этого, вы получите исключение времени выполнения при первом обращении к чему-либо, что не может сериализовать, например, открытое свойство, которое возвращает интерфейс в качестве своего. тип, класс без конструктора без параметров и т. д.!
Связано, но не так подробно: XmlSerializer выдает InvalidOperationException при использовании ограничения общего типа, где
Также: Microsoft взяла на себя проблему