【发布时间】:2018-08-25 14:01:14
【问题描述】:
我正在尝试序列化和反序列化的类(大致):
class MyDto
{
public string Name { get; set; }
private List<string> _uniqueNameStrings = new List<string>();
[XmlArray("UniqueNames")]
[XmlArrayItem("string")]
public List<string> UniqueNameStrings
{
get => _uniqueNameStrings;
set => _uniqueNameStrings = value ?? new List<string>();
}
}
没有null-checking 的先前版本,也无法正常工作:
class MyDto
{
public string Name { get; set; }
[XmlArray("UniqueNames")]
[XmlArrayItem("string")]
public List<string> UniqueNameStrings { get; set; }
}
为此类生成的架构:
<xs:complexType name="MyDto">
<xs:sequence>
<xs:element minOccurs="0" maxOccurs="1" name="Name" nillable="true" type="xs:string" />
<xs:element minOccurs="0" maxOccurs="1" name="UniqueNames" type="ArrayOfString" />
</xs:sequence>
</xs:complexType>
<xs:complexType name="ArrayOfString">
<xs:sequence>
<xs:element minOccurs="0" maxOccurs="unbounded" name="string" nillable="true" type="xs:string" />
</xs:sequence>
</xs:complexType>
以及序列化的效果:
<MyDto>
<Name>MyDtoName</Name>
<UniqueNames>
<string>SomeName</string>
<string>SomeOtherName</string>
<!-- ... <-->
</UniqueNames>
</MyDto>
所以序列化看起来工作正常,问题是在反序列化时,XML 似乎完全忽略了字符串值。这是调用代码:
using System.IO.Abstractions;
private IFileSystem _fileSystem;
public void SerializeDto(object dto, string filePath)
{
var serializer = new XmlSerializer(dto.GetType());
using (var streamWriter = _fileSystem.FileStream.Create(filePath, FileMode.Create, FileAccess.Write))
{
serializer.Serialize(streamWriter, dto);
streamWriter.Flush();
}
}
public T DeserializeDto<T>(string filePath) where T : class
{
var serializer = new XmlSerializer(typeof(T));
using (var streamReader = _fileSystem.FileStream.Create(filePath, FileMode.Open, FileAccess.Read))
{
return (T) serializer.Deserialize(streamReader);
}
}
Name 属性(以及我为简单起见省略的所有其他属性)已正确反序列化,而UniqueNames 则留空。我在set 方法处设置了一个断点,我可以看到反序列化程序使用value 调用它,相当于一个空的List<string>,就好像<string> 元素不存在一样。由于我无法查看 XML 代码以了解那里发生了什么,所以我被卡住了。关于为什么 XmlSerializer 忽略字符串数组中的值的任何想法?特别是因为它本身已经将值序列化为这种格式,现在无法处理读取它......
【问题讨论】:
-
如果将元素名称更改为
string以外的其他名称,是否有效? -
不。将元素名称更改为
UniqueName后仍为value.Count = 0。 -
如果您将
UniqueNameStrings属性更改为string[]? -
现在可以了,谢谢!但是您知道为什么
List<string>以一种方式工作,而另一种则不行吗? -
我无法在 .NET Framework 4.7 或 4.5.1 中重现这一点,正如 @ParrishHusband 所说,请同时添加您的序列化代码。
标签: c# .net xml xmlserializer