C# 如何序列化/反序列化字典变量?
我有一个字典变量,程序读取XML文件,然后按类型实例化字典变量中存储的对象以提高性能。我想将Dictionary变量存储到memcache中以供重用,但是,由于Dictionary变量和实例化对象都是引用类型,当我操作实例化对象以更改某些值时,memcache的缓存值也会更改 代码如下所示。 类的字典变量和XPathNavigator变量无法序列化。如何序列化/反序列化或实现类似效果?谢谢C# 如何序列化/反序列化字典变量?,c#,.net,serialization,dictionary,xml-serialization,C#,.net,Serialization,Dictionary,Xml Serialization,我有一个字典变量,程序读取XML文件,然后按类型实例化字典变量中存储的对象以提高性能。我想将Dictionary变量存储到memcache中以供重用,但是,由于Dictionary变量和实例化对象都是引用类型,当我操作实例化对象以更改某些值时,memcache的缓存值也会更改 代码如下所示。 类的字典变量和XPathNavigator变量无法序列化。如何序列化/反序列化或实现类似效果?谢谢 namespace ObjectReference { public interface
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;
}
}
}
}
}
}
命名空间对象引用
{
公共接口IMyObject
{
int Id{get;set;}
字符串Url{get;set;}
布尔状态{get;set;}
boolsetItemXML(XPathNavigator);
}
[可序列化]
公共类MyLink:IMyObject
{
公共int Id{get;set;}
公共字符串Url{get;set;}
公共布尔状态{get;set;}
专用XPathNavigator xmlNavigator;
公共bool SetItemXml(XPathNavigator navigator)
{
_xmlNavigator=navigator.Clone();
Id=int.Parse(_xmlNavigator.SelectSingleNode(“Id”).Value);
Url=_xmlNavigator.SelectSingleNode(“Url”).Value;
返回true;
}
}
[可序列化]
公共类MyPicture:IMyObject
{
公共int Id{get;set;}
公共字符串Url{get;set;}
公共布尔状态{get;set;}
专用XPathNavigator xmlNavigator;
公共bool SetItemXml(XPathNavigator navigator)
{
_xmlNavigator=navigator.Clone();
Id=int.Parse(_xmlNavigator.SelectSingleNode(“Id”).Value);
Url=_xmlNavigator.SelectSingleNode(“Url”).Value;
返回true;
}
}
公共部分类\u默认值:System.Web.UI.Page
{
公共IDictionary CreateObjects()
{
IDictionary objects=新字典();
var reader=new XmlTextReader(new StringReader(@“MyLink1http://www.google.comMyLink2http://stackoverflow.comMyPicture3http://static.adzerk.net/Advertisers/2565.png"));
XPathNavigator navigator=新的XPathDocument(reader).CreateNavigator();
XPathNodeInterator节点=导航器。选择(“//根/项”);
while(nodes.MoveNext())
{
字符串classType=nodes.Current.SelectSingleNode(“type”).Value;
int id=int.Parse(nodes.Current.SelectSingleNode(“id”).Value);
如果(!objects.ContainsKey(classType)| |!objects[classType].ContainsKey(id))
{
IMyObject myObject=Activator.CreateInstance(Type.GetType(string.Concat(“ObjectReference.”,classType)),作为IMyObject;
SetItemXml(nodes.Current);
如果(!objects.ContainsKey(类类型))
Add(classType,newdictionary(){{id,myObject}});
如果(!objects[classType].ContainsKey(id))为else
对象[classType]。添加(id,myObject);
}
}
归还物品;
}
受保护的无效页面加载(对象发送方、事件参数e)
{
IDictionary ObjectList=新字典();
if(HttpContext.Current.Cache[“ObjectCache”]!=null)
{
ObjectList=(字典)HttpContext.Current.Cache[“ObjectCache”];
}
其他的
{
ObjectList=CreateObjects();
HttpContext.Current.Cache.Insert(
“对象缓存”,
对象列表,
无效的
DateTime.Now.AddMinutes(2),
System.Web.Caching.Cache.NoSlidingExpiration);
}
foreach(ObjectList中的var父对象)
{
foreach(ObjectList[parent.Key]中的var子对象)
{
if(false==child.Value.State)
{
//待办事项…注意这里
child.Value.State=true;
}
}
}
}
}
}
看看下面的内容