我用代码序列化了一个类:
public void Save()
{
string fichero = Application.persistentDataPath + "/" + nombreJuego + ".dat";
FileStream file = File.Create(fichero);
DataContractSerializer bf = new DataContractSerializer(typeof(JuegoMesa));
MemoryStream streamer = new MemoryStream();
bf.WriteObject(streamer, this);
streamer.Seek(0, SeekOrigin.Begin);
file.Write(streamer.GetBuffer(), 0, streamer.GetBuffer().Length);
file.Close();
}
并使用以下方法反序列化:
public void Load()
{
string fichero = Application.persistentDataPath + "/" + nombreJuego + ".dat";
Debug.Log(fichero);
DataContractSerializer bf = new DataContractSerializer(typeof(JuegoMesa));
try
{
JuegoMesa leido = null;
object objeto;
MemoryStream streamer = new MemoryStream(File.ReadAllBytes(fichero));
streamer.Seek(0, SeekOrigin.Begin);
objeto = bf.ReadObject(streamer);
leido = (JuegoMesa)objeto;
ActualizarListas(leido.listaListas);
ActualizarPropiedades(leido.listaPropiedades);
ActualizarRecursos(leido.listaRecursos);
ActualizarComponentes(leido.listaComponentes);
}
catch (FileNotFoundException)
{
listaListas.Clear();
listaPropiedades.Clear();
listaRecursos.Limpiar();
listaComponentes.Clear();
Save();
}
}
在阅读对象时给了我一个例外:
XmlException:找不到类型;名称:PropiedadTexto,名称空间:http://schemas.datacontract.org/2004/07/ System.Runtime.Serialization.XmlFormatterDeserializer.GetTypeFromNamePair(System.String名称,System.String ns)
该类具有以下要序列化的元素:
public string nombreJuego;
public List<TextosPredefinidos> listaListas;
public List<Propiedad> listaPropiedades;
public ListaRecursos listaRecursos;
public List<ListaRecursos> listaComponentes;
List<Propiedad>
是从Propiedad类派生的类的对象列表。例如带有错误的类
[Serializable]
public class PropiedadTexto : Propiedad
{
public string textoDescriptivo;
public PropiedadTexto() : base()
{
}
...
}
有人知道是什么问题吗?
为我的英语不好道歉。
谢谢。
答案 0 :(得分:1)
当尝试创建最小/完整/可验证的示例时,我找到了解决方案。我仍然不明白为什么会给出错误,但是解决方案是创建一个从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());
但是统一不能识别DataContractResolver类。使用的替代方法是通知DataContractSerializer构造函数中的未知类型。
private List<Type> tiposConocidos;
tiposConocidos.Add(typeof(PropiedadTexto));
tiposConocidos.Add(typeof(PropiedadEntero));
DataContractSerializer bf = new DataContractSerializer(typeof(JuegoMesa), tiposConocidos);