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

时间:2013-01-02 16:15:02

标签: c# windows-mobile

我有一堆类型的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)...
}

我希望在应用程序启动时初始化它们,而不是在运行时创建它们 这些是Serializer类的一部分,我不确定这是一个好方法吗?有没有更好的方法来进行这种初始化,是否还有其他相关成本?

我是否正确假设这个初始化成本只使用static关键字?

进行一次

编辑:该项目是适用于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;
            }
        }
    }
}

需要测试此线程的安全性。

3 个答案:

答案 0 :(得分:1)

您可以实现单例模式

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

答案 1 :(得分:0)

答案是肯定的,如果这些XmlSerializer变量不是静态的,那么每当你启动你的课程class Serializer时,它们都会被初始化为该课程。

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

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

修改

根据您的情况,您可能对此感兴趣:

Implementing Singleton in C#

答案 2 :(得分:0)

使它们成为静态将在代码中第一次使用类时创建实例。执行此操作的唯一额外开销是在运行应用程序的整个时间内使用内存。只有这个类的几个实例,性能的提高将大大超过这个小的内存使用量。

此外,您可以在编译时生成序列化程序集。在您的c#项目中,转到属性,然后转到构建标签。靠近底部的是生成序列化程序集选项。这将使用sgen.exe工具预编译XmlSerializer程序集。如果没有在编译时完成,那就是在运行时完成的事情。

project setting documentation on MSDN