gpt4 book ai didi

使用 protobuf-net 的 ASP.NET SessionState 模式 SQLServer 序列化

转载 作者:行者123 更新时间:2023-12-01 11:57:59 26 4
gpt4 key购买 nike

问题背景

我一直在考虑优化 SQL Server 中 session 的非状态存储的方法,我遇到的一些方法是:

  • 在不需要 session 的页面上禁用 session 状态。此外,在未写入 session 的页面上使用只读。
  • 在 ASP.NET 4.0 中使用 gzip 压缩选项。
  • 尽量将 session 中存储的数据量保持在最低限度。
  • 等等

现在,我在 session 中存储了一个对象(一个名为 SessionObject 的类)。好消息是,它是完全可序列化的。

使用 protobuf-net 进行优化

An additional way I thought might be a good way to optimize the storage of sessions would be to use protocol buffers (protobuf-net) serialization/deserialization instead of the standard BinaryFormatter. I understand I could have all of my objects inherit ISerializable, but I'd like to not create DTO's or clutter up my Domain layer with serialize/deserialize logic.

Any suggestions using protobuf-net with session state SQL server mode would be great!

最佳答案

如果现有的 session 状态代码使用 BinaryFormatter,那么您可以通过实现 让 protobuf-net 充当 BinaryFormatter 的内部代理来作弊ISerializable 仅在您的根对象上:

[ProtoContract]
class SessionObject : ISerializable {
public SessionObject() { }
protected SessionObject(SerializationInfo info, StreamingContext context) {
Serializer.Merge(info, this);
}
void ISerializable.GetObjectData(SerializationInfo info, StreamingContext context) {
Serializer.Serialize(info, this);
}

[ProtoMember(1)]
public string Foo { get; set; }
...
}

注意事项:

  • 只有根对象需要这样做;任何封装的对象将由 protobuf-net 自动处理
  • 它仍然会为最外层的对象添加一点类型的元数据,但不会太多
  • 您将需要相应地装饰成员(和封装类型)(这最好针对每个成员显式完成;有一种隐含的“自己解决”模式,但如果您添加新成员,这会很脆弱)
  • 这将打破现有状态;改变序列化机制从根本上说是一个突破性的改变

如果您想从 root 对象中删除类型元数据,则必须实现您自己的状态提供程序(我认为 MSDN 上有一个示例);

  • 优点:产量较小
  • 优点:无需在根对象上实现ISerializable
  • 缺点:需要维护自己的state provider ;p

(上面提出的所有其他要点仍然适用)

另请注意,此处 protobuf-net 的有效性将在一定程度上取决于您存储的数据是什么。它应该更小,但如果你有很多非常大的字符串,它不会小很多,因为 protobuf 仍然对字符串使用 UTF-8。

如果您确实有很多字符串,您可能会考虑另外使用 gzip - 我为我的上一个尝试 gzip 的雇主编写了一个状态提供程序,并存储了最小的(原始或 gzip) -显然有一些检查,例如:

  • 如果它小于 [some value],则不要 gzip
  • 如果 gzip 超过原始压缩,则尽早将 gzip 压缩短路

以上内容可以非常愉快地与 protobuf-net 一起结合使用 - 如果您正在编写一个状态提供程序无论如何您可以删除ISerializable 等以获得最佳性能。

最后一个选项,如果你真的想要,我会向 [ProtoContract(..., CompressionMode = ...)] 添加一个“压缩模式”属性;其中:

  • 只会申请ISerializable用法(出于技术原因,更改主要布局没有意义,但这种情况会很好)
  • 在上述序列化/反序列化过程中自动应用 gzip [可能使用我上面提到的相同检查]
  • 意味着您不需要添加自己的状态提供者

但是,这是我真正只想申请“v2”的东西(我对 v1 中的错误修复非常残酷,这样我才能保持理智)。

如果您对此感兴趣,请告诉我。

关于使用 protobuf-net 的 ASP.NET SessionState 模式 SQLServer 序列化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4976595/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com