如何在不进行序列化的情况下Redis缓存大型C#对象?

金斯·彼得

在我的应用程序中,我们使用C#字典在内存中缓存大型Business对象。

我正在将巨大的多轮引用的C#对象(当JSON序列化时为〜300KB)转换为DTO,以进行Redis缓存的JSON序列化/反序列化。

似乎由于参数化构造函数,我的业务层中的某些类型无法轻松初始化。

有没有一种方法可以在不进行序列化的情况下实现Redis缓存?这样可以退还我缓存的相同对象吗?

金斯·彼得

好的。我知道我问了这个问题已经很长时间了。但是我们解决了这个问题。我们使用BinaryFormatter序列化程序,该序列化程序实际上将.NET对象转换为内存映射,并将其序列化为二进制数组。该内存映射可用于在没有公共默认构造函数的情况下重新创建原始对象。早期版本的.NET支持此BinaryFormatter序列化。

这种方法的缺点是我们必须手动进入对象层次结构中的每个类,并为Serializable该类提供Attribute装饰。另一个缺点是,只有包含非null值的属性才被序列化。这意味着,如果您的任何单元测试都没有初始化要序列化的对象的某些或任何属性,那么我们很有可能遇到运行时“序列化异常”,可以通过修饰类型来轻松解决该异常。Serializable

我们也可以使用其他序列化格式,例如MsgPack等。

public class TheTypeToBeCached
{
   public OneSubType Property1 {get;set;}
   public SecondSubType Property2 {get;set;}
}

public class OneSubType 
{
    public ThirdSubType Property3 {get;set;}
    public ForthSubType Property4 {get;set;}
    public AnotherSubType Property5 {get;set;}
}
public class SecondSubType
{
    public ForthSubType Property6 {get;set;}
    public AnotherSubType Property7 {get;set;}
}
public class ThridSubType
{
    public SecondSubType Property8{get;set;}
}
public class ForthSubType
{
    public SecondSubType Property9{get;set;}
}
public class AnotherSubType
{
    public OneSubType Property10{get;set;}
}

即使具有多个回合关系,也可以使用BinaryFormatter序列化程序对上述层次结构进行序列化和反序列化。

[Serializable]
public class TheTypeToBeCached
{
   public OneSubType Property1 {get;set;}
   public SecondSubType Property2 {get;set;}
}

[Serializable]
public class OneSubType 
{
    public ThirdSubType Property3 {get;set;}
    public ForthSubType Property4 {get;set;}
    public AnotherSubType Property5 {get;set;}
}

[Serializable]
public class SecondSubType
{
    public ForthSubType Property6 {get;set;}
    public AnotherSubType Property7 {get;set;}
}

[Serializable]
public class ThridSubType
{
    public SecondSubType Property8{get;set;}
}

[Serializable]
public class ForthSubType
{
    public SecondSubType Property9{get;set;}
}

[Serializable]
public class AnotherSubType
{
    public OneSubType Property10{get;set;}
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何在不进行序列化的情况下将对象作为输入传递给WorkManager?

如何在不进行序列化的情况下解析Xml并存储每个节点的Xpath

如何在不使用 File.ReadAllLines 的情况下从 json 文件读取序列化对象?C#

如何在不包含函数的情况下对对象进行JSON序列化并包括@property属性?

如何在不实际序列化对象的情况下估计Java中对象的序列化大小?

如何在对象结构未知的情况下反序列化JSON对象

如何在没有 php 序列化的情况下使用 laravel 在 redis 缓存中存储原始 json 字符串?

如何在不使用序列化的情况下制作Java对象的深层副本?

如何在不丢失“连接”的情况下序列化Atom api对象

Json.Net-如何在没有外部括号的情况下序列化C#列表?

在某些问题未解决的情况下,如何在C#中反序列化json

如何在不进行外部缓存的情况下将“ this”传递到Promise中?

JavaScript:如何在不进行ISO日期转换的情况下JSON.Stringify Date对象

如何在不进行实际打印的情况下从(错误)对象中生成字符串?

对象如何在不进行 db 调用的情况下从 DB 获取最新值?

Jackson Databind-如何在不指定目标类的情况下反序列化对象?

如何在不使用文件的情况下序列化一个对象(例如HashMap)?

我如何在没有类对象的情况下使用json序列化一个int值?

如何在字符串值包装在同名对象中的情况下彻底反序列化JSON

如何在不进行迁移的情况下卸载 macports?

如何在不进行配置的情况下启动tmux?

如何在没有包含元素的情况下序列化“任何”元素的序列

如何在不使用 C# 中的序列化的情况下重新打开表单时在按钮上获取选定的组合框项目和文本

如何在不进行硬编码的情况下获取C ++中类数组的长度?

C ++如何在不进行隐式转换的情况下模拟函数?

如何在不进行多次 cout 的情况下轻松打印行?(C++)

Spring,JSON序列化程序,仅在某些情况下对字段进行序列化

如何在不使用对象的情况下序列化为JSON

如何在没有列表名称的情况下使用Jackson序列化列表?