はになるはずですが、CFには予測できない制限があります。
xmlは必須ですか? 20kのレコードで試してみるのは覚えていませんが、もう1つの選択肢はで、別のシリアライザを使ってみてください。たとえば、protobuf-netがCF2で動作します。私はそれが動作することを保証することはできませんが、それはショットの価値があるかもしれません。
(特に、私は現在、CF内でさらに"generics" limitationsを回避するためにコードをリファクタリングしていますが、非常に複雑なオブジェクトモデルを使用しない限り、これはあなたには影響しません)。
使用例。この例はまた、XmlSerializer
のために[OK]を動作しますが、いるProtobufネットの使用は、スペースのわずか20%(あなたは文字がメモリ内の2バイトの各していることやスペースの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)]
などを使用しました。これにより、シリアル化の細かい制御(ジグザグvs twoscompliment、グループ化vs長さ接頭辞など)も可能になります。
おかげで - 感謝。そのタイミングは満足いくものですか?情報の場合は、Delegate.CreateDelegateを使用してプロパティのアクセスを最適化できるため、CF 3.5では再び高速になります。 –
いいえ、ありがとう、ずっと速いです。 XmlSerializerを使用すると、20000レコードに対して3分50秒かかります。 – GenericTypeTea