Sto tentando di serializzare un oggetto grafico nel .NET con il seguente metodo:Come si identifica il campo che causa il fallimento della serializzazione binaria in .NET?
public static byte[] Serialize(object data)
{
var binary = new BinaryFormatter();
using (var ms = new MemoryStream()) {
binary.Serialize(ms, data);
return ms.ToArray();
}
}
Tuttavia, sono in esecuzione nella seguente errore:
FormatException: Input string was not in a correct format.
Stack Trace:
at System.Number.StringToNumber(String str, NumberStyles options, NumberBuffer& number, NumberFormatInfo info, Boolean parseDecimal)
at System.Number.ParseInt32(String s, NumberStyles style, NumberFormatInfo info)
at System.String.System.IConvertible.ToInt32(IFormatProvider provider)
at System.Convert.ToInt32(Object value, IFormatProvider provider)
at System.Runtime.Serialization.Formatters.Binary.__BinaryWriter.WriteValue(InternalPrimitiveTypeE code, Object value)
at System.Runtime.Serialization.Formatters.Binary.__BinaryWriter.WriteMember(NameInfo memberNameInfo, NameInfo typeNameInfo, Object value)
at System.Runtime.Serialization.Formatters.Binary.ObjectWriter.WriteKnownValueClass(NameInfo memberNameInfo, NameInfo typeNameInfo, Object data)
at System.Runtime.Serialization.Formatters.Binary.ObjectWriter.WriteMembers(NameInfo memberNameInfo, NameInfo memberTypeNameInfo, Object memberData, WriteObjectInfo objectInfo, NameInfo typeNameInfo, WriteObjectInfo memberObjectInfo)
at System.Runtime.Serialization.Formatters.Binary.ObjectWriter.WriteMemberSetup(WriteObjectInfo objectInfo, NameInfo memberNameInfo, NameInfo typeNameInfo, String memberName, Type memberType, Object memberData, WriteObjectInfo memberObjectInfo)
at System.Runtime.Serialization.Formatters.Binary.ObjectWriter.Write(WriteObjectInfo objectInfo, NameInfo memberNameInfo, NameInfo typeNameInfo, String[] memberNames, Type[] memberTypes, Object[] memberData, WriteObjectInfo[] memberObjectInfos)
at System.Runtime.Serialization.Formatters.Binary.ObjectWriter.Write(WriteObjectInfo objectInfo, NameInfo memberNameInfo, NameInfo typeNameInfo)
at System.Runtime.Serialization.Formatters.Binary.ObjectWriter.Serialize(Object graph, Header[] inHeaders, __BinaryWriter serWriter, Boolean fCheck)
at System.Runtime.Serialization.Formatters.Binary.BinaryFormatter.Serialize(Stream serializationStream, Object graph, Header[] headers, Boolean fCheck)
C'è un modo semplice per identificare quali il campo sta producendo questo errore? Potrei ricorsivamente contrassegnare i campi nel grafo degli oggetti come NonSerialized per restringere i potenziali colpevoli, ma poiché il grafo degli oggetti è piuttosto esteso, questo è oneroso e sembra non necessario.
Nota che non sono sicuro del perché il BinaryFormatter non possa serializzare uno o più valori nel grafico dell'oggetto. Se l'oggetto può essere memorizzato in memoria al runtime, non è chiaro il motivo per cui non può essere serializzato. Questo potrebbe essere un problema con un enum?
Ci scusiamo per il lungo ritardo nell'accettare questo. Non ho mai avuto il tempo di verificare questo approccio, ma poiché fornisce informazioni su uno strumento potenzialmente utile di cui non ero a conoscenza, penso che questa risposta sia la più utile/promettente. – mcliedtk
L'ho usato per eseguire il debug di una grande modifica al modello di dati serializzato e mi ha indirizzato rapidamente nella giusta direzione. Una volta interrotta l'eccezione corretta, è possibile utilizzare! Clrstack -p per ottenere un dump della traccia dello stack con i puntatori ai parametri. Per il mio caso molti di loro non avevano dati, ma più in alto lo stack conteneva un puntatore all'oggetto che veniva serializzato. –