为什么当反序列化成功时,反序列化总是返回false ?



我试图将xml字符串反序列化为对象,这没什么奇怪的。一切都很好,直到我把我的项目升级到。net 5。

在升级中,我必须添加一个对软件包Microsoft.XmlSerializer的引用。生成器,并修改项目文件以添加以下内容:

<ItemGroup>
<DotNetCliToolReference Include="Microsoft.XmlSerializer.Generator" Version="1.0.0" />
</ItemGroup>

允许我创建XmlSerializer(第一个错误很奇怪)。但是,现在,如果类具有XmlRoot属性,则对XmlReader的每个candeseralize调用都会返回false。现在,我可以反序列化xml文本了。这确实有效。但是为什么序列化会因为这个条件而失败呢?

下面是我用来在控制台应用程序(. net 5)中测试的类和代码。

[Serializable, XmlRoot("TestObj")]
//[Serializable]
public class TestObj
{
public int TestVal;
}
static void Main(string[] args)
{
var serializer = new XmlSerializer(typeof(TestObj));
//generated by doing a test serialization of the class
var teststr = "<TestObj xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"><TestVal>2</TestVal></TestObj>";
using (var str = new StringReader(teststr))
using (var reader = XmlReader.Create(str))
{
if (serializer.CanDeserialize(reader))
Console.WriteLine(((TestObj)serializer.Deserialize(reader)).TestVal);
else
{
Console.WriteLine("Value cannot be deserialized into the given Type");
//try it anyway
var o = (TestObj)serializer.Deserialize(reader);
Console.WriteLine(o.TestVal);
}
}
}

我的解决方法只是消除反序列化调用并将反序列化包装在try中。但是我仍然很好奇为什么会发生这种情况。

好吧,@dbc对这个问题的评论确实让我尝试了别的东西。我留下了一些细节,因为它似乎不相关(由于涉及的测试),我试图在非测试中反序列化的类是在。net标准2.1库中。而做反序列化的项目是。net . 5.

最后,我得到了这份工作。我不得不在我的。net标准库中引用Microsoft.XmlSerializer.Generator包,但没有在。net 5项目中引用它。

简而言之,将包引用从标准项目中删除会导致一个错误,而将其包含在两个项目中会导致另一个错误。

最新更新