【问题标题】:binaryFormatter.Deserialize(stream) : Debugging and fixing errorsbinaryFormatter.Deserialize(stream) :调试和修复错误
【发布时间】:2012-06-12 12:51:41
【问题描述】:

我正在使用 BinaryFormatter 对自定义文件类型进行序列化和反序列化。我有一个独立的应用程序和一个 Web 应用程序,它们可以读取和写入相同的文件。独立应用程序运行良好,但是当我使用 Web 应用程序读取文件时,会引发异常。问题是我看不到到底发生了什么,我该如何调试或修复这个错误?

    BinaryFormatter b = new BinaryFormatter();
    b.AssemblyFormat = System.Runtime.Serialization.Formatters.FormatterAssemblyStyle.Simple;
    b.Binder = new WebBinder();

    object o = b.Deserialize(s); //Throws exception :

“System.String”类型的对象无法转换为“System.Decimal”类型。

    public class WebBinder : SerializationBinder
    {
        public override Type BindToType(string assemblyName, string typeName)
        {
            Type tyType = null;
            string sShortAssemblyName = assemblyName.Split(',')[0];
            Assembly[] ayAssemblies = AppDomain.CurrentDomain.GetAssemblies();
            foreach (Assembly ayAssembly in ayAssemblies)
            {
                if (sShortAssemblyName == ayAssembly.FullName.Split(',')[0])
                {
                    tyType = ayAssembly.GetType(typeName);
                    break;
                }
            }
            return tyType;
        }
    }

同一个文件在独立应用中反序列化正常吗??

【问题讨论】:

  • 异常告诉你你正在尝试反序列化一个 Decimal 但被序列化的是一个字符串。
  • 您是否严格绑定到 BinaryFormatter? 不依赖类型的序列化程序可能是个好主意
  • @MarcGravell:我很好奇,你所说的 依赖于类型的序列化器是什么意思,在某种意义上说 at/d 序列化器依赖于 mem .类型的大小和布局还是其他?
  • @MarcGravell:你说得对,使用二进制序列化是一个坏主意,尤其是结合混淆,但我们现在坚持下去:-)

标签: c# .net serialization deserialization binary-serialization


【解决方案1】:

我会将 Visual Studio 设置为中断所有异常。在 Debug/Exceptions 中更改为:

这将向您显示发生问题的确切代码行。

【讨论】:

  • 它几乎已经告诉他问题了,他期待一个小数但得到一个字符串,如果那描述性不够,那么我不知道编码员最近发生了什么:L
  • 他说“问题是我看不到到底发生了什么,我该如何调试或修复这个错误?”。这意味着原始异常被序列化运行时“吞下”或以其他方式掩盖。我的建议是显示有问题的代码行,而不仅仅是序列化运行时包装后的异常。
  • 有趣,我可能也会为自己偷这个小费;)
  • 再次感谢您的帮助,肯特! :-)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-11-28
  • 1970-01-01
  • 2016-03-13
  • 2012-11-29
  • 2013-12-19
  • 1970-01-01
相关资源
最近更新 更多