gpt4 book ai didi

c# - Cast 与序列化/反序列化 C#

转载 作者:太空宇宙 更新时间:2023-11-03 21:06:23 25 4
gpt4 key购买 nike

场景

我有一个 virtual基类中的方法,它采用 object作为参数。

我在派生类中重写它 - 更具体地说, View 模型 - 为了从那里处理不同的对象,还有:

public override void SomeMethod(object parameter)
{
// ...

base.SomeMethod(parameter);
}

编辑: 澄清一下 - 我无法更改 SomeMethod基类中的签名 - 不幸的是,我坚持 object作为类型:(

假设每个派生类都期望与下一个派生类不同的类型,但我知道每个类需要使用什么类型才能传递和使用它。

特别是,我会问Dictionary<string, string> ;但我很想知道这是否适用于其他类型。


想象一下……

那么,假设我有一个 Dictionary<string, string>我想转给SomeMethod() :

这是字典:

// create the dictionary
var myItem = new Dictionary<string, string>
{
["Key1"] = "Value1",
["Key2"] = "Value2"
// ...
};

到目前为止我有什么......

可能性...

为了通过 myItem 我可以想到两种可能的方法到 SomeMethod() :

// Pass the myItem directly as an object

SomeMethod(myItem);

// Serialize the myItem to a string, and then pass that as an object
// I'm using JsonConvert in this case

object parameter = JsonConvert.SerializeObject(myItem);
SomeMethod(parameter);

消费元素

然后,我可以使用 2 种可能的方式来消费我刚刚传递给 SomeMethod() 的项目, 取决于我在上面分别使用了哪种方法:

public override void SomeMethod(object parameter)
{
// Cast the parameter back to a dictionary
Dictionary<string, string> unboxedItem = parameter as Dictionary<string, string>;

// consume away...
}

public override void SomeMethod(object parameter)
{
// Deserialize the parameter from a string
Dictionary<string, string> deserializedItem =
JsonConvert
.DeserializeObject<Dictionary<string, string>>(parameter as string);

// consume away...
}

有帮助吗?

这 2 种方法中哪种方法占用资源较少?

我听说装箱和拆箱最终会很慢(在大规模情况下)。

是的,我明白我实际上是在装箱序列化的 string在第二种方法中 - 就资源而言,我从/到哪种类型的装箱/拆箱有关系吗?

转换到对象/从对象转换会对性能产生影响吗?或者,反序列化会真正影响性能吗?

更新:所以,看来我有点傻,对装箱/拆箱的东西有误解 - 所以我更新了问题以反射(reflect)这一点

非常感谢您的评论、建议和帮助:)

最佳答案

首先,拳击不是这里发生的事情。装箱是指准备值类型作为引用类型放在堆上的操作。如果您的字典是值类型,那么它确实需要装箱和拆箱。

唉,字典是一种引用类型。这意味着不会有拳击。引用将按原样传递给您的方法。您的方法必须做的是对字典进行向下转换。虽然这需要评估对象的 RTTI(运行时类型信息),但通常不会注意到性能影响(极端情况除外)。

然而,您的序列化/反序列化解决方案要昂贵得多。您将不得不在堆上为字符串分配空间,您必须序列化、反序列化并且该字符串最终需要被垃圾回收。你可以预料到这比简单的沮丧要昂贵得多。

更新:

只是为了说明这一点,您仍然可以期望装箱比序列化更便宜。因此,即使对于值类型,也没有理由选择序列化。尤其是因为在整个序列化往返过程中您很有可能至少有一个装箱操作。

关于c# - Cast 与序列化/反序列化 C#,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40875902/

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