我几年前创建了一个.NET应用程序而没有过多考虑文件格式:它使用soap格式化程序来序列化我们的大型对象层次结构。这很简单,所以我没有多想。
考虑到以下问题,我现在正试图提出更优的文件格式: 保存文件时,它最终会转换为字节数组,并通过网络发送到数据库进行存储。这最终成为一个大问题,因为你拥有内存中的所有对象,然后为序列化器分配更多内存,然后为字节数组分配更多内存。即使是适度大小的对象图也会使用大量内存来处理保存文件。
我不确定如何从文件格式的角度改进这一点,但也可能从算法的角度来看(对象 - >流 - >字节数组)
更新的: 我总是在通过线路发送之前压缩字节数组,所以虽然这是一个很好的建议,但它已经在我的应用程序中实现了。
我确实从Soap转换为二进制序列化,这已经产生了巨大的差异:我们的文件比以前小了大约7倍。 (当然,你的里程可能会有所不同)。
答案 0 :(得分:4)
如果您需要高效的序列化,并且不关心它是否被序列化为二进制格式,那么只需在.NET中使用标准二进制序列化。您可以使用[Serializable]属性装饰可序列化类型,并使用BinaryFormatter将对象序列化为byte []。
答案 1 :(得分:3)
序列化对象时,请使用属性而不是节点。使用节点有很多浪费的空间。您可以通过在属性/字段上添加[XmlAttribute]标记来轻松完成此操作。
参考链接:http://msdn.microsoft.com/en-us/library/2baksw0z(VS.71).aspx
答案 2 :(得分:3)
BinaryFormatter + DeflateStream =压缩的持久对象
using System;
using System.IO;
using System.IO.Compression;
using System.Runtime.Serialization.Formatters.Binary;
namespace CompressedSerialized
{
class Program
{
static void Main(string[] args)
{
var obj1 = new MyObject() { Prop1 = "p1", Prop2 = "p2" };
MyObject obj2 = null;
var bin = new BinaryFormatter();
byte[] buffer = null;
using (var ms = new MemoryStream())
{
using (var zip = new DeflateStream(ms, CompressionMode.Compress))
{
bin.Serialize(zip, obj1);
zip.Flush();
}
buffer = ms.ToArray();
}
using (var ms = new MemoryStream(buffer))
using (var unzip = new DeflateStream(ms, CompressionMode.Decompress))
{
var des = bin.Deserialize(unzip);
obj2 = des as MyObject;
}
}
}
[Serializable]
public class MyObject
{
public string Prop1 { get; set; }
public string Prop2 { get; set; }
}
}
答案 3 :(得分:1)
您也可以尝试使用压缩/压缩流,我认为从内存中SharpZipLib允许您创建压缩流。
答案 4 :(得分:0)
为什么不将应用程序从XML移到JSON?有许多库可以在.NET中序列化/反序列化JSON。
答案 5 :(得分:0)
我使用LZMA来压缩我存储到数据库的数据。例如,将事物从36,000提取到6000.使用起来非常简单,并且您不必将数据存储为二进制文件,也可以是字符串。