C#中的偶发序列化失败

时间:2011-10-27 17:46:42

标签: c# serialization binary-serialization

我们对系统进行了Excel导入,我们进行了非常严格的测试。最近,我们注意到零星的序列化错误。

这些错误在我们针对导入的自动化测试中突然出现,反复使用相同的文件。如果我们每次都得到这个错误,我会理解,但同样的序列化过程可能会失败一次而不是下一次错误似乎很奇怪。

Exception: 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)

1 个答案:

答案 0 :(得分:1)

您是否有机会使用依赖反射的库将Excel文件映射到对象图?

例如,我遇到了Filehelpers在映射到文本文件时损坏数据的问题。不经常发生,但确实发生了,而且只是间歇性的。

在这种情况下,FileHelpers的问题在于FileHelpers.RecordInfo.RecursiveGetFields(...),后者又调用FileHelpers.FieldInfoCacheManipulator.ResetFieldInfoCache(...),它使用反射来修改实际.NET反射的私有成员库试图强制.NET反射按照声明的顺序返回字段。

但Microsoft明确声明“您的代码不得依赖于返回字段/属性的顺序”http://msdn.microsoft.com/en-us/library/kyaxdd3x.aspxhttp://msdn.microsoft.com/en-us/library/6ztex2dc.aspx

如果您正在使用类似的类库,它将解释您的间歇性错误,因为库可能与不正确的源属性/字段(可能是不同的类型)不匹配反序列化。

相关问题