C# C语言中的零星序列化失败#

C# C语言中的零星序列化失败#,c#,serialization,binary-serialization,C#,Serialization,Binary Serialization,我们有一个Excel导入到我们的系统中,我们进行了严格的测试。最近,我们注意到零星的序列化错误 这些错误在我们针对导入的自动化测试中突然出现,我们反复使用同一个文件。如果我们每次都遇到这个错误,我会理解,但奇怪的是,同一个序列化过程可能会失败一次而不是下一次 Exception: FormatException: Input string was not in a correct format. Stack Trace: at System.Number.StringToNumber(Str

我们有一个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)

您是否碰巧使用了依赖反射的库将Excel文件映射到对象图

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

在本例中,FileHelpers的问题在于FileHelpers.RecordInfo.RecursiveGetFields(…),它依次调用FileHelpers.FieldInfoCacheMipulator.ResetFieldInfoCache(…)它使用反射修改实际.NET反射库的私有成员,试图强制.NET反射按声明字段的顺序返回字段

但是,Microsoft明确声明“您的代码不能依赖于字段/属性的返回顺序”,并且


如果您使用的库执行类似的操作,它将解释您的间歇性错误,因为库可能会使反序列化与不正确的源属性/字段不匹配,这可能是另一种类型。

这些是单元测试吗?您的测试是否修改了Excel文件?这些不是单元测试。这些是在浏览器测试中自动完成的。所有测试都不会修改excel文件,只是重复上传。我们在生产过程中也曾多次看到这个错误,但它们似乎是一次性的,用户如果再试一次,似乎能够成功上传。非常奇怪的堆栈跟踪。很难想象为什么格式化程序认为成员是int32,但实际上是字符串。不知道实际对象的任何信息都会使猜测落空。我会添加一个额外的检查,以查看整个文件是否在反序列化(长度和校验和)之前到达。re:Hans,对象图非常大,很遗憾,或者我会发布它。我们使用反射映射到一个中间对象集,然后进行序列化。关于字段/属性顺序的有趣注释。通过这个过程,我认为我们意识到BinaryFormatter太脆弱,容易出错。只考虑XML序列化或protobuf()