C# C语言中的字典数据序列化#

C# C语言中的字典数据序列化#,c#,generics,dictionary,serialization,C#,Generics,Dictionary,Serialization,我想将字典数据转换成XML。我正在尝试使用XML序列化,但遇到了一个错误。下面是我的代码 class Program { static void Main(string[] args) { Dictionary<int, AddressDetails> objDic = new Dictionary<int, AddressDetails>(); for (int i = 1; i <= 5; i++)

我想将字典数据转换成XML。我正在尝试使用XML序列化,但遇到了一个错误。下面是我的代码

class Program
{

    static void Main(string[] args)
    {
        Dictionary<int, AddressDetails> objDic = new Dictionary<int, AddressDetails>();
        for (int i = 1; i <= 5; i++)
        {
            AddressDetails obj = new AddressDetails();
            obj.HouseNo = i;
            obj.StreetName = "New Street One " + i;
            obj.City = "New Delhi One " + i;
            objDic.Add(i, obj);
        }

        string str = Utility.GetXMLFromObject(objDic);
    }

}

public class AddressDetails 
{
    public int HouseNo { get; set; }
    public string StreetName { get; set; }
    public string City { get; set; }
    private string PoAddress { get; set; }
}

public static class Utility
{
    public static string GetXMLFromObject(object o)
    {
        StringWriter sw = new StringWriter();
        XmlTextWriter tw = null;
        try
        {
            XmlSerializer serializer = new XmlSerializer(o.GetType());
            tw = new XmlTextWriter(sw);
            serializer.Serialize(tw, o);
        }
        catch (Exception ex)
        {
            //Handle Exception Code
        }
        finally
        {
            sw.Close();
            if (tw != null)
            {
                tw.Close();
            }
        }
        return sw.ToString();
    }
}
类程序
{
静态void Main(字符串[]参数)
{
字典objDic=新字典();

对于(int i=1;i请尝试下面链接中解释的解决方案:


您必须使用
DataContract
序列化而不是
XmlSerialization
,或者使用自定义字典类型。

使用以下字典扩展名

[XmlRoot("Dictionary")]
public class DictionaryEx<TKey, TValue> : Dictionary<TKey, TValue>, IXmlSerializable
{
    public XmlSchema GetSchema()
    {
        return null;
    }

    public void ReadXml(XmlReader reader)
    {
        XDocument document = null;
        using (XmlReader subtreeReader = reader.ReadSubtree())
        {
            document = XDocument.Load(subtreeReader);
        }

        if (document == null)
            return;

        XmlSerializer serializer = new XmlSerializer(typeof(KeyValuePairEx<TKey, TValue>));
        foreach (XElement element in document.Descendants(XName.Get("Item")))
        {
            using (XmlReader xmlReader = element.CreateReader())
            {
                var pair = serializer.Deserialize(xmlReader) as KeyValuePairEx<TKey, TValue>;
                this.Add(pair.Key, pair.Value);
            }
        }

        reader.ReadEndElement();
    }

    public void WriteXml(XmlWriter writer)
    {
        XmlSerializer serializer = new XmlSerializer(typeof(KeyValuePairEx<TKey, TValue>));
        XmlSerializerNamespaces xmlNameSpaces = new XmlSerializerNamespaces();
        xmlNameSpaces.Add(string.Empty, string.Empty);

        foreach (TKey key in this.Keys)
        {
            TValue value = this[key];
            var pair = new KeyValuePairEx<TKey, TValue>(key, value);
            serializer.Serialize(writer, pair, xmlNameSpaces);
        }
    }

    [XmlRoot("Item")]
    public class KeyValuePairEx<TKey, TValue>
    {
        [XmlAttribute("Key")]
        public TKey Key;

        [XmlAttribute("Value")]
        public TValue Value;

        public KeyValuePairEx()
        {
        }

        public KeyValuePairEx(TKey key, TValue value)
        {
            Key = key;
            Value = value;
        }
    }
}
[XmlRoot(“字典”)]
公共类字典YEX:字典,IXmlSerializable
{
公共XmlSchema GetSchema()
{
返回null;
}
公共void ReadXml(XmlReader)
{
XDocument document=null;
使用(XmlReader subtreeer=reader.ReadSubtree())
{
document=XDocument.Load(子阅读器);
}
if(document==null)
回来
XmlSerializer serializer=新的XmlSerializer(typeof(KeyValuePairEx));
foreach(document.substands(XName.Get(“Item”)中的XElement元素)
{
使用(XmlReader=element.CreateReader())
{
var pair=序列化程序。反序列化(xmlReader)为KeyValuePairEx;
this.Add(pair.Key,pair.Value);
}
}
reader.ReadEndElement();
}
public void WriteXml(XmlWriter)
{
XmlSerializer serializer=新的XmlSerializer(typeof(KeyValuePairEx));
XmlSerializerNamespaces xmlNameSpaces=新的XmlSerializerNamespaces();
添加(string.Empty,string.Empty);
foreach(此.Keys中的TKey键)
{
t值=此[键];
var对=新的KeyValuePairEx(键,值);
serializer.Serialize(writer、pair、xmlnamespace);
}
}
[XmlRoot(“项目”)]
公共类KeyValuePairEx
{
[XmlAttribute(“键”)]
公钥;
[XmlAttribute(“值”)]
公共价值;
公钥值pairex()
{
}
公钥值pairex(TKey键,TValue值)
{
钥匙=钥匙;
价值=价值;
}
}
}

上述代码来自无法序列化的词典。请查看以下内容: