При попытке создать минимальный / полный / проверяемый пример я нашел решение. Я до сих пор не понимаю, почему это дает ошибку, но решение состоит в том, чтобы создать класс, производный от DataContractResolver и сообщить неизвестные типы
class ResolverXml : DataContractResolver
{
private XmlDictionary dictionary = new XmlDictionary();
public ResolverXml()
{
}
public override bool TryResolveType(Type dataContractType, Type declaredType, DataContractResolver knownTypeResolver, out XmlDictionaryString typeName, out XmlDictionaryString typeNamespace)
{
if (dataContractType == typeof(PropiedadTexto))
{
XmlDictionary dictionary = new XmlDictionary();
typeName = dictionary.Add("PropiedadTexto");
typeNamespace = dictionary.Add("JuegoMesa");
return true;
}
else
{
return knownTypeResolver.TryResolveType(dataContractType, declaredType, null, out typeName, out typeNamespace);
}
}
// public override Type ResolveName(string typeName, string typeNamespace, DataContractResolver knownTypeResolver)
public override Type ResolveName(string typeName, string typeNamespace, Type type, DataContractResolver knownTypeResolver)
{
if (typeName == "PropiedadTexto" && typeNamespace == "JuegoMesa")
{
return typeof(PropiedadTexto);
}
else
{
return knownTypeResolver.ResolveName(typeName, typeNamespace, type, null);
}
}
}
и это должно быть указано в конструкторе DataContractSerializer
DataContractSerializer bf = new DataContractSerializer(typeof(PruebaXml), null, Int32.MaxValue, false, false, null, new ResolverXml());
Но Unity не распознает класс DataContractResolver. В качестве альтернативы использовалось информирование неизвестных типов в конструкторе DataContractSerializer.
private List<Type> tiposConocidos;
tiposConocidos.Add(typeof(PropiedadTexto));
tiposConocidos.Add(typeof(PropiedadEntero));
DataContractSerializer bf = new DataContractSerializer(typeof(JuegoMesa), tiposConocidos);