提前初始化XMLSerialize以节省运行时成本

本文关键字:运行时 节省 初始化 XMLSerialize | 更新日期: 2023-09-27 17:50:20

我有一堆类型xmlserialize对象:

class Serializer{
        static XmlSerializer serializerRequest_EnterVehicle = new XmlSerializer(typeof(Request_EnterVehicle));
        static XmlSerializer serializerRequest_Cancel = new XmlSerializer(typeof(Request_Cancel));
        static XmlSerializer serializerRequest_PrintInfo = new XmlSerializer(typeof(Request_PrintInfo));
    public string ObjToXML(object toSerialize)...
}

我希望在应用程序启动时初始化它们,而不是在运行时创建它们这些都是序列化器类的一部分,我不确定这是一个好方法?是否有更好的方法来做这种初始化,是否有其他与之相关的代价?

我是否正确的假设,这个初始化成本只完成一次使用静态关键字?

编辑:该项目是针对windows mobile 6.1 Pro设备的。net 3.5 Compact Framework项目。

更新:

using System;
using System.Collections.Generic;
using System.Text;
using System.Xml.Serialization;
namespace SmartDevice_Proxy
{
    public sealed class TypedXMLSerializers
    {
        private static volatile TypedXMLSerializers instance;
        private static object syncRoot = new Object();
        //Implementation as Singleton
        static XmlSerializer serializerRequest_EnterVehicle = new XmlSerializer(typeof(Request_EnterVehicle));
        static XmlSerializer serializerRequest_Cancel = new XmlSerializer(typeof(Request_Cancel));
        static XmlSerializer serializerRequest_PrintInfo = new XmlSerializer(typeof(Request_PrintInfo));
        private TypedXMLSerializers() { }
        public static TypedXMLSerializers Instance
        {
            get
            {
                if (instance == null)
                {
                    lock (syncRoot)
                    {
                        if (instance == null)
                            instance = new TypedXMLSerializers();
                    }
                }
                return instance;
            }
        }
    }
}

需要测试线程安全性。

提前初始化XMLSerialize以节省运行时成本

可以实现单例模式

链接:http://www.yoda.arachsys.com/csharp/singleton.html

将它们设置为静态将在代码中第一次使用该类时创建实例。这样做的唯一额外开销是,在应用程序运行的整个过程中都会使用内存。如果这个类只有几个实例,性能的提高将大大超过这一小块内存的使用。

另外,您可以在编译时生成序列化程序集。在你的c#项目中,选择Properties,然后选择Build选项卡。底部附近是生成序列化程序集选项。这将使用sgen.exe工具预编译您的XmlSerializer程序集。

在编译时未完成,在运行时完成的操作。

MSDN项目设置文档

答案是肯定的,如果这些XmlSerializer s变量不是静态的,那么每次您将初始化类class Serializer时,它们将为该类初始化。

当它们是静态的,它们不必在应用程序启动时初始化,它们只会在class Serializer中的任何静态或非静态成员(函数或变量)第一次被调用时初始化一次。

如果在整个应用程序过程中只有一个class Serializer实例,那么将它们设置为static或非静态将没有真正的区别。

编辑:

根据您的场景,您可能对以下内容感兴趣:

在c#中实现单例