如何使用Dictionary属性序列化对象?在下面的示例代码中,我收到此错误:ElementTestSerializeDictionary123.Customer.CustomPropertiesvomTypSystem.Collections.Generic.Dictionary`2[[System.String,mscorlib,Version=2.0.0.0,Culture=neutral,PublicKeyToken=b77a5c561934e089],[System.Object,mscorlib,Version=2.0.0.0,Culture=neutral,PublicKeyToken=b77a5c561934e089]]无法序列化,因为它实现了IDictionary。当我取出Dictionary属性时,它工作正常。如何使用字典属性序列化此Customer对象?或者我可以使用什么替换类型的字典来序列化?使用System.Collections.Generic;使用System.Xml.Serialization;使用System.IO;使用System.Xml;使用系统文本;namespaceTestSerializeDictionary123{publicclassProgram{staticvoidMain(string[]args){Listcustomers=Customer.GetCustomers();Console.WriteLine("---序列化------------------");foreach(varcustomerincustomers){Console.WriteLine("Serializing"+customer.GetFullName()+"...");字符串xml=XmlHelpers.SerializeObject(客户);控制台.WriteLine(xml);Console.WriteLine("反序列化...");客户customer2=XmlHelpers.DeserializeObject(xml);Console.WriteLine(customer2.GetFullName());Console.WriteLine("---");}控制台.ReadLine();}}publicstaticclassStringHelpers{publicstaticStringUTF8ByteArrayToString(Byte[]characters){UTF8Encodingencoding=newUTF8Encoding();StringconstructedString=编码。获取字符串(字符);返回n(构造字符串);}publicstaticByte[]StringToUTF8ByteArray(StringpXmlString){UTF8Encoding编码=newUTF8Encoding();Byte[]byteArray=encoding.GetBytes(pXmlString);返回字节数组;}}publicstaticclassXmlHelpers{publicstaticstringSerializeObject(objecto){MemoryStreamms=newMemoryStream();XmlSerializerxs=newXmlSerializer(typeof(T));XmlTextWriterxtw=newXmlTextWriter(ms,Encoding.UTF8);xs.Serialize(xtw,o);ms=(MemoryStream)xtw.BaseStream;返回StringHelpers.UTF8ByteArrayToString(ms.ToArray());}publicstaticTDeserializeObject(stringxml){XmlSerializerxs=newXmlSerializer(typeof(T));MemoryStreamms=newMemoryStream(StringHelpers.StringToUTF8ByteArray(xml));XmlTextWriterxtw=newXmlTextWriter(ms,Encoding.UTF8);返回(T)xs.Deserialize(ms);}}publicclassCustomer{publicintId{get;放;}publicstringFirstName{get;放;}publicstringLastName{get;放;}公共字符串Street{得到;放;}公共字符串位置{得到;放;}publicstringZipCode{get;放;}publicDictionaryCustomProperties{get;放;}私有int内部值=23;publicstaticListGetCustomers(){列出客户=newList();customers.Add(newCustomer{Id=1,FirstName="Jim",LastName="Jones",ZipCode="23434"});customers.Add(newCustomer{Id=2,FirstName="Joe",LastName="Adams",ZipCode="12312"});customers.Add(newCustomer{Id=3,FirstName="Jack",LastName="Johnson",ZipCode="23111"});customers.Add(newCustomer{Id=4,FirstName="Angie",LastName="Reckar",ZipCode="54343"});customers.Add(newCustomer{Id=5,FirstName="Henry",LastName="Anderson",ZipCode="16623"});回头客;}publicstringGetFullName(){returnFirstName+""+LastName+"("+internalValue+")";在我们的应用中,我们最终使用:DataContractSerializerxs=newDataContractSerializer(typeof(T));替代:XmlSeraliizerxs=newXmlSerializer(typeof(T));这解决了问题,因为DatacontractSerializer支持Dictionary另一个解决方案是XMLSerializableGenericDictionary变通方法也适用于上面的示例,并且在链接上为使用它的人完成了一个长时间的讨论,这可能对处理这个问题的人有用。这是一个知道如何自行序列化的常用字典类:publicclassXmlDictionary:Dictionary,IXmlSerializable{[XmlType("Entry")]publicstructEntry{publicEntry(Tkey,Vvalue):this(){Key=key;价值=价值;}[XmlElement("Key")]publicTKey{get;放;}[XmlElement("Value")]publicVValue{get;放;}}System.Xml.Schema.XmlSchemaIXmlSerializable.GetSchema(){返回空;}voidIXmlSerializable.ReadXml(System.Xml.XmlReaderreader){this.Clear();varserializer=newXmlSerializer(typeof(List));读者。阅读();//为什么这是必要的?varlist=(List)serializer.Deserialize(reader);foreach(varentryinlist)this.Add(entry.Key,entry.Value);reader.ReadEndElement();}voidIXmlSerializable.WriteXml(System.Xml.XmlWriterwriter){varlist=newList(this.Count);foreach(varentryinthis)list.Add(newEntry(entry.Key,entry.Value));XmlSerializer序列化器=newXmlSerializer(list.GetType());serializer.Serialize(writer,list);你不能(没有自己做,这是可怕的);xml序列化程序不知道如何处理该对象,因为它不包含有线格式的类型元数据一个(hacky)选项是将这些全部作为字符串进行流式传输以进行序列化,但您需要编写很多额外的解析(等)代码。您可以使用二进制序列化。(只需确保所有类都标记为[Serializable]。当然,它不是XML,但你没有将其列为要求:).Xml.Serialization.IXmlSerializable类重写XmlSerialization。在WriteXml方法中定义如何序列化XML中的对象,并定义如何从ReadXml方法中的xml字符串重新创建对象。但这不起作用,因为您的Dictionary包含对象而不是特定类型。如何将Customer类标记为DataContract并将其属性标记为DataMembers。DataContract序列化程序将为您进行序列化。尝试通过BinaryFormatter序列化以上是C#学习教程:如何使用Dictionary属性序列化对象?如果分享的内容对你有用,需要进一步了解C#学习教程,希望你多多关注——privatevoidDeserialize(){try{varf_fileStream=File.OpenRead(@"dictionarySerialized.xml");varf_binaryFormatter=newSystem.Runtime.Serialization.Formatters.Binary.BinaryFormatter();myDictionary=(Dictionary)f_binaryFormatter.Deserialize(f_fileStream);f_fileStream.Close();}赶上(异常前){;{尝试{varf_fileStream=newFileStream(@"dictionarySerialized.xml",FileMode.Create,FileAccess.Write);varf_binaryFormatter=newSystem.Runtime.Serialization.Formatters.Binary.BinaryFormatter();f_binaryFormatter.Serialize(f_fileStream,myDictionary);f_fileStream.Close();}赶上(异常前){;}}本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处:
