Ja próbuje serializacji wykresu obiektu w .NET z następującą metodą:Jak zidentyfikować pole powodujące, że serializacja binarna zawiedzie w .NET?
public static byte[] Serialize(object data)
{
var binary = new BinaryFormatter();
using (var ms = new MemoryStream()) {
binary.Serialize(ms, data);
return ms.ToArray();
}
}
Jednakże używam w następujący błąd:
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)
Czy istnieje prosty sposób określić, które pole produkuje ten błąd? Mogłem rekurencyjnie oznaczyć pola na wykresie obiektu jako NonSerialized, aby zawęzić potencjalnych winowajców, ale ponieważ wykres obiektów jest dość obszerny, jest to uciążliwe i wydaje się niepotrzebne.
Należy zauważyć, że nie jestem pewien, dlaczego BinaryFormatter nie może serializować jednej lub więcej wartości na wykresie obiektu. Jeśli obiekt może być przechowywany w pamięci w środowisku wykonawczym, nie jest jasne, dlaczego nie można go serializować. Czy to może być problem z wyliczeniem?
Przepraszamy za długie opóźnienie w zaakceptowaniu tego. Nigdy nie miałem czasu zweryfikować tego podejścia, ale ponieważ zapewnia ono wgląd w potencjalnie przydatne narzędzie, którego nie znałem, myślę, że ta odpowiedź jest najbardziej przydatna/obiecująca. – mcliedtk
Użyłem tego do debugowania dużej zmiany modelu danych, który jest serializowany i szybko wskazał mi właściwy kierunek. Po przerwaniu poprawnego wyjątku możesz użyć! Clrstack -p, aby uzyskać zrzut śledzenia stosu ze wskaźnikami do parametrów. W moim przypadku wiele z nich nie posiadało żadnych danych, ale dalej na stosie zawierało wskaźnik do serializowanego obiektu. –