【问题标题】:Static instance of DataContractJsonSerializer - good or bad design?DataContractJsonSerializer 的静态实例 - 设计好还是坏?
【发布时间】:2011-06-21 20:16:36
【问题描述】:

我有一个类用于序列化和反序列化 ASP.NET 应用程序中的业务对象。

该类包含这个静态变量:

private static DataContractJsonSerializer m_serializer = new DataContractJsonSerializer(typeof(MyBusinessObject));

...以及类中的两个静态方法:

public static string SerializeJson(MyBusinessObject bo);

public static MyBusinessObject DeserializeJson(string json);

在这些方法中,我使用静态 DataContractJsonSerializer 对象 (m_serializer) 来执行序列化和反序列化。这样,我不需要为每个调用实例化一个 DataContractJsonSerializer 实例。

这样使用静态变量是否正确设计?

如果我在序列化/反序列化代码上获得大量点击,我会遇到任何问题吗?

将从每秒获得 100 次并发点击的网站调用。

【问题讨论】:

    标签: c# asp.net concurrency static static-variables


    【解决方案1】:

    正如 Alex 所提到的,您可能遇到问题 - 该类的文档指出它不是线程安全的(至少不是用于读取/写入对象的方法)。通过快速浏览反射器,似乎序列化实际上可以工作(假设您没有在不同的线程中同时序列化同一个对象,这是一个全新的蠕虫罐),但由于它是一个内部实现细节,在新版本的框架中,该类可能会发生一些变化(即优化),而这将不再是真的。

    您可以考虑的一个选项是拥有一个可重复使用的序列化器。您的代码将从池中获取一个序列化程序,使用它来序列化/反序列化,然后将其返回到池中。通过这种方式,您可以获得重用实例的好处,但没有在多个线程中使用线程不安全类的风险。

    最后,您是否验证了序列化程序的创建确实是一个问题(即通过分析)?在您的场景中所花费的时间可能可以忽略不计,并且使用某种重用只会给您的代码增加不必要的复杂性。

    【讨论】:

    • 在有限的测试中,无论我使用静态变量还是每次调用都初始化一个,性能似乎大致相同。
    • 在这种情况下,不要担心优化代码 - 以易于维护的方式编写它。正如高手 Knuth 所说,“过早的优化是万恶之源”。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-09-11
    • 2015-10-29
    • 2015-05-16
    • 1970-01-01
    • 2012-01-27
    • 2010-10-17
    • 1970-01-01
    相关资源
    最近更新 更多