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)