【问题标题】:XmlSerializer throws an exception on deserializationXmlSerializer 在反序列化时抛出异常
【发布时间】:2011-10-11 12:43:36
【问题描述】:

我偶然发现了 .NET XmlSerializer 的一个问题。 每当我尝试反序列化我的一些项目类时,我都会收到带有以下消息的FileNotFound-Exception:

Could not load file or assembly 'mscorlib.XmlSerializers, Version=2.0.0.0,
Culture=neutral, PublicKeyToken=b77a5c561934e089' or one of its dependencies.
The system cannot find the file specified.

我知道我遇到了这个异常,因为我在 Visual Studio 中禁用了“仅我的代码”选项。我实际上想要获得该异常,因此我可以确保为缺少它的项目生成 XmlSerializers.dll,但正如您在本例中看到的那样,它是 mscorlib.dll。我似乎无法弄清楚问题是什么。当我使用 sgen.exe 并尝试为我要反序列化的类的项目生成 XmlSerializers.dll 时,我收到了一些警告,但生成了 XmlSerializers.dll。被反序列化的类没有什么特别的。它包含以下类型的一些属性

2x short
1x string
2x DateTime
1x List<short>
1x List<MyClass>

'MyClass' 也没有什么特别之处,只是一些短裤、一个字符串和一个 DateTime 属性。

我有其他类基本上具有相同的数据类型范围,并且它们反序列化得很好。这可能是 CLR 中的错​​误吗?

我创建了一个测试项目并复制了 2 个类并对其进行了反序列化,没有出现异常。

我的 CLR 版本是 2.0。

如果您需要有关该主题的更多信息,请告诉我,如果它可以帮助我解决此问题,我很乐意提供您需要的任何信息。任何帮助将不胜感激。

提前致谢。

您好,

安德烈

更新:

sll 这里要求的是类

序列化类:

public class SerializedClass
{
#region Constructor
/// <summary>
/// constructor for serialization only
/// </summary>
public SerializedClass() { }

/// <summary>
/// public constructor
/// </summary>
public SerializedClass(short id, string bez, DateTime updateY, DateTime updateX, short lastID)
{

  this.ID = id;
  this.Bez = bez;
  this.UpdateY = updateY;
  this.UpdateX = updateX;
  this.LoadedSprs = new List<short>();
  this.LoadedHandRefs = new List<TraderHandRef>();
  this.LastID = lastID;

} // SerializedClass

#endregion

public short LastID { get; set; }

public short ID { get; set; }

public string Bez { get; set; }

public DateTime UpdateY { get; set; }

public DateTime UpdateX { get; set; }

public List<short> LanguageIDs { get; set; }

public List<MyClass> MyClass { get; set; }

}

我的班级:

public class MyClass
{

#region Constructor

/// <summary>
/// constructor for serialization only
/// </summary>
public MyClass() { }

#endregion

#region Properties

/// <summary>
/// get/set KID value
/// </summary>
public short KID { get; set; }

/// <summary>
/// get/set Date value
/// </summary>
public DateTime Date { get; set; }

/// <summary>
/// get/set VID value
/// </summary>
public short VID { get; set; }

/// <summary>
/// get/set description value
/// </summary>
public string Description { get; set; }

/// <summary>
/// get/set ID value
/// </summary>
public short ID { get; set; }

#endregion
}

我的反序列化调用如下所示:

System.Xml.Serialization.XmlSerializer serial = new System.Xml.Serialization.XmlSerializer(typeof(T));

其中 T 表示 SerializedClass。

【问题讨论】:

标签: c# .net xml-serialization xmlserializer


【解决方案1】:

我相信这是一个预期的错误。 C# XmlSerializer BindingFailure 描述了问题及其发生的原因

【讨论】:

  • 就像我在帖子顶部所说的那样,我知道当 XmlSerializers.dll 不可用时会出现此错误。问题是为什么 mscorlib.XmlSerializers.dll 在那个时候不可用,或者我做错了什么,它没有被生成。
【解决方案2】:

我认为您需要将 Serializable 属性添加到您的类中。

[Serializable()]
public class SerializedClass
{

【讨论】:

  • 嗨,约翰尼,感谢您的反对票!昨晚我遇到了同样的问题,我通过将 Serialize 属性添加到我的类来解决它。
  • 嘿,马克,我有 Serializable 属性,它在帖子中看起来很奇怪,所以我删除了它,抱歉。
  • 别担心,安德烈,我昨晚也在做同样的事情,我收到了相同(或类似)的消息。我将这个类隔离到一个单独的项目中,它工作得很好,但是一旦我添加了 Serialize 属性,它就像一个冠军一样工作。祝你好运!
【解决方案3】:

您可以尝试为 mscorlib 生成序列化程序集:

REM In a Visual Studio Prompt:
sgen /a:C:\Windows\assembly\GAC_32\mscorlib\2.0.0.0__b77a5c561934e089\mscorlib.dll /o:.\x32
sgen /a:C:\Windows\assembly\GAC_64\mscorlib\2.0.0.0__b77a5c561934e089\mscorlib.dll /o:.\x64

【讨论】:

  • 我不确定那个乔纳森。我会将生成的序列化程序集放在哪里?我的项目的输出是一个客户端应用程序。据我所知,任何版本的 .NET 2.0 都可以运行该程序,因此部分或大多数人仍然会遇到此问题。还是谢谢。
  • @AndreFly 它可能会直接在您客户的目录中工作;但是您需要为 x86 和 x64 保留两个目录,并将它们与探测配置连接起来。 msdn.microsoft.com/en-us/library/823z9h8w.aspx
  • @AndreFly 我认为你很不走运:(。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-10-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多