【问题标题】:How to Serialize/DeSerialize a Dictionary variable?如何序列化/反序列化字典变量?
【发布时间】:2011-05-13 15:18:54
【问题描述】:

我有一个 Dictionary 变量,程序读取 XML 文件,然后按类型实例化存储在 Dictionary 变量中的对象以提高性能。我想把Dictionary变量存到memcache中以便复用,但是由于Dictionary变量和实例化对象都是引用类型,所以当我操作实例化对象改变一些值时,memcache的缓存值也发生了变化。

如下代码。 类的字典变量和 XPathNavigator 变量无法序列化。我怎样才能序列化/反序列化或达到类似的效果?谢谢。

namespace ObjectReference
{    
    public interface IMyObject
    {
        int Id { get; set; }
        string Url { get; set; }
        bool State { get; set; }
        bool SetItemXml(XPathNavigator navigator);
    }

    [Serializable]
    public class MyLink : IMyObject
    {
        public int Id { get; set; }
        public string Url { get; set; }
        public bool State { get; set; }
        private XPathNavigator _xmlNavigator;

        public bool SetItemXml(XPathNavigator navigator)
        {
            _xmlNavigator = navigator.Clone();
            Id = int.Parse(_xmlNavigator.SelectSingleNode("id").Value);
            Url = _xmlNavigator.SelectSingleNode("url").Value;

            return true;
        }
    }

    [Serializable]
    public class MyPicture : IMyObject
    {
        public int Id { get; set; }
        public string Url { get; set; }
        public bool State { get; set; }
        private XPathNavigator _xmlNavigator;

        public bool SetItemXml(XPathNavigator navigator)
        {
            _xmlNavigator = navigator.Clone();
            Id = int.Parse(_xmlNavigator.SelectSingleNode("id").Value);
            Url = _xmlNavigator.SelectSingleNode("url").Value;

            return true;
        }
    }

    public partial class _Default : System.Web.UI.Page
    {
        public IDictionary<string, IDictionary<int, IMyObject>> CreateObjects()
        {
            IDictionary<string, IDictionary<int, IMyObject>> objects = new Dictionary<string, IDictionary<int, IMyObject>>();

            var reader = new XmlTextReader(new StringReader(@"<?xml version='1.0' encoding='utf-8'?><root><item><type>MyLink</type><id>1</id><url>http://www.google.com</url></item><item><type>MyLink</type><id>2</id><url>http://stackoverflow.com</url></item><item><type>MyPicture</type><id>3</id><url>http://static.adzerk.net/Advertisers/2565.png</url></item></root>"));
            XPathNavigator navigator = new XPathDocument(reader).CreateNavigator();
            XPathNodeIterator nodes = navigator.Select("//root/item");

            while (nodes.MoveNext())
            {
                string classType = nodes.Current.SelectSingleNode("type").Value;
                int id = int.Parse(nodes.Current.SelectSingleNode("id").Value);
                if (!objects.ContainsKey(classType) || !objects[classType].ContainsKey(id))
                {
                    IMyObject myObject = Activator.CreateInstance(Type.GetType(string.Concat("ObjectReference.", classType))) as IMyObject;
                    myObject.SetItemXml(nodes.Current);

                    if (!objects.ContainsKey(classType))
                        objects.Add(classType, new Dictionary<int, IMyObject>() { { id, myObject } });
                    else if (!objects[classType].ContainsKey(id))
                        objects[classType].Add(id, myObject);
                }
            }

            return objects;
        }

        protected void Page_Load(object sender, EventArgs e)
        {
            IDictionary<string, IDictionary<int, IMyObject>> ObjectList = new Dictionary<string, IDictionary<int, IMyObject>>();

            if (HttpContext.Current.Cache["ObjectCache"] != null)
            {
                ObjectList = (Dictionary<string, IDictionary<int, IMyObject>>)HttpContext.Current.Cache["ObjectCache"];
            }
            else
            {
                ObjectList = CreateObjects();

                HttpContext.Current.Cache.Insert(
                    "ObjectCache",
                    ObjectList,
                    null,
                    DateTime.Now.AddMinutes(2),
                    System.Web.Caching.Cache.NoSlidingExpiration);
            }

            foreach(var parent in ObjectList)
            {
                foreach(var child in ObjectList[parent.Key])
                {
                    if(false == child.Value.State)
                    {
                        //TODO... Note here
                        child.Value.State = true;
                    }
                }
            }
        }
    }
}

【问题讨论】:

    标签: c# .net serialization dictionary xml-serialization


    【解决方案1】:

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多