Я обнаружил, что он не работает с внутренними / закрытыми типами, но, сделав мой тип общедоступным, он работал нормально. Это также означает отсутствие анонимных типов: (
Используя отражатель, я нашел метод ClassDataContract.IsNonAttributedTypeValidForSerialization (Type), который, кажется, принимает решение. Это последняя строка, которая кажется убийцей, тип должен быть видимым, поэтому не допускаются внутренние / частные типы: (
internal static bool IsNonAttributedTypeValidForSerialization(Type type)
{
if (type.IsArray)
{
return false;
}
if (type.IsEnum)
{
return false;
}
if (type.IsGenericParameter)
{
return false;
}
if (Globals.TypeOfIXmlSerializable.IsAssignableFrom(type))
{
return false;
}
if (type.IsPointer)
{
return false;
}
if (type.IsDefined(Globals.TypeOfCollectionDataContractAttribute, false))
{
return false;
}
foreach (Type type2 in type.GetInterfaces())
{
if (CollectionDataContract.IsCollectionInterface(type2))
{
return false;
}
}
if (type.IsSerializable)
{
return false;
}
if (Globals.TypeOfISerializable.IsAssignableFrom(type))
{
return false;
}
if (type.IsDefined(Globals.TypeOfDataContractAttribute, false))
{
return false;
}
if (type == Globals.TypeOfExtensionDataObject)
{
return false;
}
if (type.IsValueType)
{
return type.IsVisible;
}
return (type.IsVisible && (type.GetConstructor(BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Instance, null, Globals.EmptyTypeArray, null) != null));
}