【发布时间】:2015-01-08 19:43:13
【问题描述】:
假设我有以下代码:
namespace Test
{
[DataContract()]
internal class Class2 : AbstractSerializeableObject
{
[DataMember()]
int[] ints;
protected override XMLVersion ObjectVersion
{
get { return version; }
}
[DataMember()]
private XMLVersion version = new XMLVersion(1, 0, 0, "Test");
protected override void SetDefaults()
{
ints = new int[] { 1, 2, 3, 4 };
}
}
}
最终序列化为以下 XML 文件:
<?xml version="1.0" encoding="utf-8"?>
<Class2 xmlns:i="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://schemas.datacontract.org/2004/07/Test">
<ints xmlns:d2p1="http://schemas.microsoft.com/2003/10/Serialization/Arrays">
<d2p1:int>1</d2p1:int>
<d2p1:int>2</d2p1:int>
<d2p1:int>3</d2p1:int>
<d2p1:int>4</d2p1:int>
</ints>
<version xmlns:d2p1="http://schemas.datacontract.org/2004/07/XMLSerializationLib">
<d2p1:description></d2p1:description>
<d2p1:major>1</d2p1:major>
<d2p1:minor>0</d2p1:minor>
<d2p1:patch>0</d2p1:patch>
<d2p1:title>Test</d2p1:title>
</version>
</Class2>
现在我想从我的ints 数组中删除几个元素。我的AbstractSerializeableObject 设计为在序列化或调用构造函数时调用SetDefaults(以与接受的答案here 相同的方式)问题是DataContractSerializer 读取整个集合的内容(无论默认数组中有多少元素)。因此,如果 XML 中有 4 个元素,我的默认值列表中有 2 个元素,那么我的反序列化数组中将有 4 个元素。
有什么方法可以修复集合的大小,以便在反序列化时省略 XML 文件中的额外值?
【问题讨论】:
-
您无法更改数组的大小。为什么不使用 List
? -
这不是问题;如果我使用列表、数组甚至字典,我也会遇到同样的问题;真的是任何收藏。
-
假设我在 DataContract 的第一个版本中使用 5 个元素初始化数组。然后假设我对合同进行了修改,而是只用 3 个元素对其进行了初始化。当前一个合约的 XML 文件用新合约反序列化时,它会拉入 5 个元素而不是 3 个。
标签: c# xml wcf serialization collections