我尝试重现这个问题,但即使每个1300多万个对象只有2个字节,代码也需要永远运行.因此,我怀疑您不仅可以解决问题,还可以在自定义ISerialize实施中将数据打包得更好时显着提高性能.不要让序列化程序看到你的结构如此深入,而是在你的对象图形爆炸成数十万个数组或更多元素的位置切掉它(因为假设你有很多对象,它们很小)或者你无论如何都无法将它们留在记忆中).以此示例为例,它允许序列化程序查看类B和C,但手动管理类A的集合:
class Program { static void Main(string[] args) { C c = new C(8, 2000000); System.Runtime.Serialization.Formatters.Binary.BinaryFormatter bf = new System.Runtime.Serialization.Formatters.Binary.BinaryFormatter(); System.IO.MemoryStream ms = new System.IO.MemoryStream(); bf.Serialize(ms, c); ms.Seek(0, System.IO.SeekOrigin.Begin); for (int i = 0; i < 3; i++) for (int j = i; j < i + 3; j++) Console.WriteLine("{0}, {1}", c.all[i][j].b1, c.all[i][j].b2); Console.WriteLine("====="); c = null; c = (C)(bf.Deserialize(ms)); for (int i = 0; i < 3; i++) for (int j = i; j < i + 3; j++) Console.WriteLine("{0}, {1}", c.all[i][j].b1, c.all[i][j].b2); Console.WriteLine("====="); } } class A { byte dataByte1; byte dataByte2; public A(byte b1, byte b2) { dataByte1 = b1; dataByte2 = b2; } public UInt16 GetAllData() { return (UInt16)((dataByte1 << 8) | dataByte2); } public A(UInt16 allData) { dataByte1 = (byte)(allData >> 8); dataByte2 = (byte)(allData & 0xff); } public byte b1 { get { return dataByte1; } } public byte b2 { get { return dataByte2; } } } [Serializable()] class B : System.Runtime.Serialization.ISerializable { string name; List myList; public B(int size) { myList = new List(size); for (int i = 0; i < size; i++) { myList.Add(new A((byte)(i % 255), (byte)((i + 1) % 255))); } name = "List of " + size.ToString(); } public A this[int index] { get { return myList[index]; } } #region ISerializable Members public void GetObjectData(System.Runtime.Serialization.SerializationInfo info, System.Runtime.Serialization.StreamingContext context) { UInt16[] packed = new UInt16[myList.Count]; info.AddValue("name", name); for (int i = 0; i < myList.Count; i++) { packed[i] = myList[i].GetAllData(); } info.AddValue("packedData", packed); } protected B(System.Runtime.Serialization.SerializationInfo info, System.Runtime.Serialization.StreamingContext context) { name = info.GetString("name"); UInt16[] packed = (UInt16[])(info.GetValue("packedData", typeof(UInt16[]))); myList = new List(packed.Length); for (int i = 0; i < packed.Length; i++) myList.Add(new A(packed[i])); } #endregion } [Serializable()] class C { public List all; public C(int count, int size) { all = new List(count); for (int i = 0; i < count; i++) { all.Add(new B(size)); } } }