コンパクトなフレームワーク アプリケーションに取り組んでおり、パフォーマンスを向上させる必要があります。アプリは現在、オブジェクトを XML にシリアル化し、データベースに保存することでオフラインで動作します。プロファイリング ツールを使用すると、これがかなり大きなオーバーヘッドであり、アプリの速度が低下することがわかりました。バイナリシリアライゼーションに切り替えるとパフォーマンスが上がると思ったのですが、コンパクトなフレームワークではサポートされていないため、protobuf-net を調べました。シリアル化は高速に見えますが、逆シリアル化ははるかに遅く、アプリはシリアル化よりも多くの逆シリアル化を行っています。
バイナリのシリアル化を高速化する必要がありますか?そうであれば、パフォーマンスを高速化するために何ができますか? XML とバイナリの両方を使用する方法のスニペットを次に示します。
XML シリアル化:
public string Serialize(T obj)
{
UTF8Encoding encoding = new UTF8Encoding();
XmlSerializer serializer = new XmlSerializer(typeof(T));
MemoryStream stream = new MemoryStream();
XmlTextWriter writer = new XmlTextWriter(stream, Encoding.UTF8);
serializer.Serialize(stream, obj);
stream = (MemoryStream)writer.BaseStream;
return encoding.GetString(stream.ToArray(), 0, Convert.ToInt32(stream.Length));
}
public T Deserialize(string xml)
{
UTF8Encoding encoding = new UTF8Encoding();
XmlSerializer serializer = new XmlSerializer(typeof(T));
MemoryStream stream = new MemoryStream(encoding.GetBytes(xml));
return (T)serializer.Deserialize(stream);
}
Protobuf-net バイナリ シリアル化:
public byte[] Serialize(T obj)
{
byte[] raw;
using (MemoryStream memoryStream = new MemoryStream())
{
Serializer.Serialize(memoryStream, obj);
raw = memoryStream.ToArray();
}
return raw;
}
public T Deserialize(byte[] serializedType)
{
T obj;
using (MemoryStream memoryStream = new MemoryStream(serializedType))
{
obj = Serializer.Deserialize<T>(memoryStream);
}
return obj;
}