哈希表的XML序列化(C#3.0) [英] XML serialization of hash table(C#3.0)

查看:138
本文介绍了哈希表的XML序列化(C#3.0)的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试序列化哈希表但没有发生

  private void Form1_Load(object sender,EventArgs e)
{
Hashtable ht = new Hashtable();

DateTime dt = DateTime.Now;
for(int i = 0; i< 10; i ++)
ht.Add(dt.AddDays(i),i);
SerializeToXmlAsFile(typeof(Hashtable),ht);
}

私人无效SerializeToXmlAsFile(Type targetType,Object targetObject)
{
try
{
string fileName = @ C:\ \output.xml;
//序列化为XML
XmlSerializer s = new XmlSerializer(targetType);
TextWriter w =新的StreamWriter(fileName);
s.Serialize(w,targetObject);
w.Flush();
w.Close();
}
catch(异常例外){抛出异常; }
}

在Google搜索后,我发现无法对推动IDictonary的对象进行序列化。但是,我在二进制序列化方面取得了成功。



但是我想拥有一个xml。



我正在使用C#3.0



谢谢

解决方案

首先从C#2.0开始,您可以使用非常旧的 Hashtable 的类型安全版本来自.NET 1.0。因此,您可以使用 Dictionary< DateTime,int>



从.NET 3.0开始,您可以使用 DataContractSerializer 。因此,您可以像下面这样重写代码

  private void Form1_Load(object sender,EventArgs e)
{
MyHashtable ht =新的MyHashtable();

DateTime dt = DateTime.Now;
for(int i = 0; i< 10; i ++)
ht.Add(dt.AddDays(i),i);
SerializeToXmlAsFile(typeof(Hashtable),ht);
}

其中 SerializeToXmlAsFile 和您定义的 MyHashtable 类型如下:

  [CollectionDataContract(Name = AllMyHashtable,ItemName = MyEntry,
KeyName = MyDate,ValueName = MyValue))]
公共类MyHashtable:Dictionary< DateTime,int> {}

private void SerializeToXmlAsFile(Type targetType,Object targetObject)
{
try {
string fileName = @ C:\output.xml;
DataContractSerializer s =新的DataContractSerializer(targetType);
XmlWriterSettings设置=新的XmlWriterSettings();
settings.Indent = true;
settings.IndentChars =();
使用(XmlWriter w = XmlWriter.Create(文件名,设置)){
s.WriteObject(w,targetObject);
w.Flush();
}
}
catch(异常例外){抛出异常; }
}

这段代码产生 C:\output.xml 文件,其中包含以下内容:

 <?xml version = 1.0 encoding = utf-8?> ; 
< AllMyHashtable xmlns:i = http://www.w3.org/2001/XMLSchema-instance
xmlns = http://schemas.datacontract.org/2004/07/DataContractXmlSerializer >
< MyEntry>
< MyDate> 2010-06-09T22:30:00.9474539 + 02:00< / MyDate>
< MyValue> 0< / MyValue>
< / MyEntry>
< MyEntry>
< MyDate> 2010-06-10T22:30:00.9474539 + 02:00< / MyDate>
< MyValue> 1< / MyValue>
< / MyEntry>
<!-...->
< / AllMyHashtable>

所以我们如何查看可以自由定义的目标XML文件元素的所有名称。 / p>

Hi I am trying to serialize a hash table but not happening

private void Form1_Load(object sender, EventArgs e)
        {
            Hashtable ht = new Hashtable();        

            DateTime dt = DateTime.Now;
            for (int i = 0; i < 10; i++)
                ht.Add(dt.AddDays(i), i);           
            SerializeToXmlAsFile(typeof(Hashtable), ht);
        }

private void SerializeToXmlAsFile(Type targetType, Object targetObject)
        {
            try
            {
                string fileName = @"C:\output.xml";
                //Serialize to XML
                XmlSerializer s = new XmlSerializer(targetType);
                TextWriter w = new StreamWriter(fileName);
                s.Serialize(w, targetObject);
                w.Flush();
                w.Close();
            }
            catch (Exception ex) { throw ex; }
        }

After a google search , I found that objects that impelment IDictonary cannot be serialized. However, I got success with binary serialization.

But I want to have xml one. Is there any way of doing so?

I am using C#3.0

Thanks

解决方案

First of all starting with C# 2.0 you can use type safe version of very old Hashtable which come from .NET 1.0. So you can use Dictionary<DateTime, int>.

Starting with .NET 3.0 you can use DataContractSerializer. So you can rewrite you code like following

private void Form1_Load(object sender, EventArgs e)
    {
        MyHashtable ht = new MyHashtable();        

        DateTime dt = DateTime.Now;
        for (int i = 0; i < 10; i++)
            ht.Add(dt.AddDays(i), i);           
        SerializeToXmlAsFile(typeof(Hashtable), ht);
    }

where SerializeToXmlAsFile and MyHashtable type you define like following:

[CollectionDataContract (Name = "AllMyHashtable", ItemName = "MyEntry",
                         KeyName = "MyDate", ValueName = "MyValue")]
public class MyHashtable : Dictionary<DateTime, int> { }

private void SerializeToXmlAsFile(Type targetType, Object targetObject)
    {
        try {
            string fileName = @"C:\output.xml";
            DataContractSerializer s = new DataContractSerializer (targetType);
            XmlWriterSettings settings = new XmlWriterSettings ();
            settings.Indent = true;
            settings.IndentChars = ("    ");
            using (XmlWriter w = XmlWriter.Create (fileName, settings)) {
                s.WriteObject (w, targetObject);
                w.Flush ();
            }
        }
        catch (Exception ex) { throw ex; }
    }

This code produce C:\output.xml file with the following contain:

<?xml version="1.0" encoding="utf-8"?>
<AllMyHashtable xmlns:i="http://www.w3.org/2001/XMLSchema-instance"
 xmlns="http://schemas.datacontract.org/2004/07/DataContractXmlSerializer">
    <MyEntry>
        <MyDate>2010-06-09T22:30:00.9474539+02:00</MyDate>
        <MyValue>0</MyValue>
    </MyEntry>
    <MyEntry>
        <MyDate>2010-06-10T22:30:00.9474539+02:00</MyDate>
        <MyValue>1</MyValue>
    </MyEntry>
    <!-- ... -->
</AllMyHashtable>

So how we can see all names of the elements of the destination XML files we can free define.

这篇关于哈希表的XML序列化(C#3.0)的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆