unity tag c# .net generics unity3d serialization

c# - unity - gameobject tag



SerializationException: no se pudo encontrar el tipo ''System.Collections.Generic.List`1 en c#unity3d (2)

Estoy intentando serializar y deserializar un objeto en c # unity3d. Para eso estoy usando el siguiente código. Pero me aparece un error mencionado a continuación.

Error: SerializationException: no se pudo encontrar el tipo ''System.Collections.Generic.List`1 [[ABC, Assembly-CSharp, Version = 1.0.2.18931, Culture = neutral, PublicKeyToken = null]]''.

Esto no está sucediendo mientras serializo el objeto save to file y lo cargué desde el archivo mientras estoy jugando el juego sin detener el juego.

Pero el error ocurre si paro el juego y cambio cualquier línea de código (irrelevante para la serialización y la deserialización) y cargo los datos del archivo guardado previamente y trato de deserializar. Estoy obteniendo una SerializationException .

Estoy usando el editor visual studio y la versión de unity3d es 5.5.4

Me puede estar perdiendo algo muy simple. alguien podría ayudarme a resolver esto.

Gracias.

public static string SerializeObject<T>(T objectToSerialize) { BinaryFormatter bf = new BinaryFormatter(); MemoryStream memStr = new MemoryStream(); try { bf.Serialize(memStr, objectToSerialize); memStr.Position = 0; return Convert.ToBase64String(memStr.ToArray()); } finally { memStr.Close(); } } public static T DeserializeObject<T>(string str) { BinaryFormatter bf = new BinaryFormatter(); bf.Binder = new CurrentAssemblyDeserializationBinder(); byte[] b = Convert.FromBase64String(str); MemoryStream ms = new MemoryStream(b); try { return (T)bf.Deserialize(ms); } finally { ms.Close(); } }

Clase que estoy usando:

[Serializable] public class ABC : ISerializable { public SerializableDictionary<int, ExampleClass> a = new SerializableDictionary<int, ExampleClass>(); public GameObject b; public GameObject c; public bool d = false; public ABC e; public int f; public string g = ""; public int h = -1; public int i = -1; public int j = -1; public string k = "default"; public XYZ l = XYZ.P; } [Serializable] public enum XYZ { P, Q } [Serializable()] public class ABCListWrapper : ISerializable { public List<ABC> abcMappings = new List<ABC>(); public string version = "1.53"; public float interval; } //Serilization abcLW = new ABCListWrapper(); abcW = getABCListWObj(); string abcWString = SerializeObject(abcW); File.WriteAllText(Application.streamingAssetsPath + "/filename.json", abcWString); //Deserilization call ABCListWrapper l = new ABCListWrapper(); string l_1 = File.ReadAllText(Application.streamingAssetsPath + "/filename.json"); l = DeserializeObject<ABCListWrapper>(l_1);

Intenta resolver el problema:

public sealed class CurrentAssemblyDeserializationBinder : SerializationBinder { public override Type BindToType(string assemblyName, string typeName) { Version assemVer1 = Assembly.GetExecutingAssembly().GetName().Version; Debug.Log("ASSEM VER: " + assemVer1 + "--NAME--" + assemblyName + " --OVERAL-- " + Assembly.GetExecutingAssembly().FullName + " --TYPE-- " + typeName ); //assemblyName = Assembly.GetExecutingAssembly().FullName.Replace(assemVer1.ToString(), "1.0.2.23455"); //string assemblyNameCustom = "Assembly-CSharp, Version=1.0.2.18931, Culture=neutral, PublicKeyToken=null"; bool isList = false; if (typeName.Contains("List`1")) isList = true; // other generics need to go here if (isList) return Type.GetType(string.Format("System.Collections.Generic.List`1[[{0}, {1}]]", "ABC", "Assembly-CSharp, Version=1.0.2.18931, Culture=neutral, PublicKeyToken=null")); else return Type.GetType(string.Format("{0}, {1}", assemblyName, typeName)); } }

Pero recibo la misma excepción y el registro en BindToType nunca se imprime. Por lo tanto, significa la función BindToType en SerilizationBinder .


El formateador binario está almacenando la información de la versión del ensamblado junto con el tipo serializado. Entonces, incluso cuando el tipo no se cambia, la serialización / deserialización cambia tan pronto como se actualiza el ensamblaje.

Consulte esta Q / A relacionada para obtener más detalles: Deserialización binaria con diferentes versiones de ensamblaje y el artículo relevante de MSDN .

Normalmente cerraría, votaría esto como un duplicado, pero no puedo debido a la recompensa abierta, así que decidí responder en su lugar;)


Para una serialización binaria rápida, los Buffers de Protocolo pueden ser una buena opción. También debería resolver problemas de compatibilidad (puede controlar campos orden / exclusión manualmente)