看起来它应该可以工作,但 CF 确实有不可预测的限制。
xml 是必需的吗?我不记得用 20k 记录尝试过,但另一种选择可能是尝试使用不同的序列化程序 - 例如,protobuf-net在 CF2 上工作。我不能保证它会起作用,但它可能值得一试。
(特别是,我目前正在重构代码以尝试解决 CF 中的一些额外的“泛型”限制——但除非你有一个非常复杂的对象模型,否则这不会影响你)。
显示用法的示例;请注意,此示例也适用于XmlSerializer
,但 protobuf-net 仅使用 20% 的空间(如果您认为字符在内存中每个字节是两个字节,则使用 10% 的空间):
using System;
using System.Collections.Generic;
using System.IO;
using System.Xml.Serialization;
using ProtoBuf;
[Serializable, ProtoContract]
public class Department
{
[ProtoMember(1)]
public string Name { get; set; }
[ProtoMember(2)]
public List<Person> People { get; set; }
}
[Serializable, ProtoContract]
public class Person
{
[ProtoMember(1)]
public int Id { get; set; }
[ProtoMember(2)]
public string Name { get; set; }
[ProtoMember(3)]
public DateTime DateOfBirth { get; set; }
}
static class Program
{
[MTAThread]
static void Main()
{
Department dept = new Department { Name = "foo"};
dept.People = new List<Person>();
Random rand = new Random(123456);
for (int i = 0; i < 20000; i++)
{
Person person = new Person();
person.Id = rand.Next(50000);
person.DateOfBirth = DateTime.Today.AddDays(-rand.Next(2000));
person.Name = "fixed name";
dept.People.Add(person);
}
byte[] raw;
using (MemoryStream ms = new MemoryStream())
{
Serializer.Serialize(ms, dept);
raw = ms.ToArray(); // 473,399 bytes
}
XmlSerializer ser = new XmlSerializer(typeof(Department));
StringWriter sw = new StringWriter();
ser.Serialize(sw, dept);
string s = sw.ToString(); // 2,115,693 characters
}
}
如果您需要更多帮助,请告诉我——我可以整天谈论这个主题;-p 请注意,它只能从标准的 xml 属性([XmlElement(Order=1)]
)中工作——为了清楚起见,我使用了更具体的[ProtoMember(1)]
等。这也允许对序列化进行细粒度控制(zigzag vs twoscompliment,分组 vs 长度前缀等)。