【问题标题】:Dictionary Data Serialization in C#C# 中的字典数据序列化
【发布时间】:2017-01-26 18:28:02
【问题描述】:

我想将我的字典数据转换成 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();
    }
}

错误代码行:XmlSerializer serializer = new XmlSerializer(o.GetType());

错误描述:

类型 System.Collections.Generic.Dictionary`2[[System.Int32, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089],[ConsoleApplication5.AddressDetails, ConsoleApplication5, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]] 不受支持,因为它实现了 IDictionary。

请提出建议。

【问题讨论】:

标签: c# generics dictionary serialization


【解决方案1】:

尝试以下链接中说明的解决方案:

http://theburningmonk.com/2010/05/net-tips-xml-serialize-or-deserialize-dictionary-in-csharp/

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

【讨论】:

    【解决方案2】:

    使用以下字典扩展名。

    [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;
            }
        }
    }
    

    以上代码来自Keyo

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-09-08
      • 2017-05-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多