1

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

需要对此进行测试以确保线程安全。

4

3 回答 3

1

您可以实现单例模式

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

于 2013-01-02T16:30:41.697 回答
0

答案是肯定的,如果这些XmlSerializers 变量不是静态的,那么每次你启动你的类class Serializer时,它们都会为那个类初始化。

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

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

编辑:

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

在 C# 中实现单例

于 2013-01-02T16:24:52.657 回答
0

将它们设为静态将在您的代码中第一次使用该类时创建实例。这样做的唯一额外开销是内存将在应用程序运行的整个时间内使用。仅使用此类的少数实例,性能提升将大大超过这种小内存使用量。

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

MSDN上的项目设置文档

于 2013-01-02T16:26:19.360 回答