当前位置: 首页 > 编程语言 > C#

如何(xml)序列化一个urishare

时间:2023-04-10 22:13:06 C#

如何(xml)序列化一个uri我有一个类,我标记为可序列化,具有Uri属性。如何在不创建字符串类型属性的情况下使Uri序列化/反序列化?基于关于如何序列化TimeSpan的答案之一,我最终得到了这个对我来说非常有用并且不需要额外属性的答案:publicclassXmlUri:IXmlSerializable{privateUri_Value;publicXmlUri(){}publicXmlUri(Urisource){_Value=source;}publicstaticimplicitoperatorUri(XmlUrio){returno==null?空:o._Value;}publicstaticimplicitoperatorXmlUri(Urio){returno==null?null:新的XmlUri(o);}publicXmlSchemaGetSchema(){返回空;}publicvoidReadXml(XmlReaderreader){_Value=newUri(reader.ReadElementContentAsString());}publicvoidWriteXml(XmlWriterwriter){writer.WriteValue(_Value.ToString());然后你可以像这样使用它publicclassSettings{publicXmlUriUri{get;放;}}...vars=newSettings{Uri=newUri("http://www.example.com")};它将很好地序列化和反序列化。注意:无法使用上述链接问题的另一个答案中给出的XmlElement(Type=typeof(...))属性的技巧,因为XmlSerializer检查基本类型的空默认构造函数。使用xml序列化程序,您会受到限制-它不像(例如)某些二进制格式器/ISerializable选项那样通用。一个常见的技巧是获取序列化的第二个属性:[XmlIgnore]publicUriUri{get;set;}[XmlAttribute("uri")][Browsable(false),EditorBrowsable(EditorBrowsableState.Never)]publicstringUriString{get{返回Uri==null?null:Uri.ToString();}设置{Uri=value==null?null:newUri(value);}}两个可浏览的属性将它隐藏在视图之外(但它需要在XmlSerializer的公共API上才能使用它)。XmlIgnore告诉它不要尝试Uri;和[XmlAttribute(...)](或[XmlElement(...)])告诉它在(反)序列化时重命名UriString。(请注意,EditorBrowsable仅适用于声明类型的程序集之外的代码)对于那些发现此问题并且不喜欢这些解决方案的人,还有另一种更灵活、更健壮的解决方案。它实现了IXmlSerializable接口。这更难,但值得。您可以创建任何您想要的xml。最简单的例子是:publicclassProduct:IXmlSerializable{publicstringCode{get;放;}公共字符串模型{得到;放;}公共字符串名称{得到;放;}publicUriImageUri{得到;放;}publicvirtualSystem.Xml.Schema.XmlSchemaGetSchema(){thrownewNotImplementedException();}publicvirtualvoidReadXml(XmlReaderreader){reader.MoveToContent();代码=reader.GetAttribute("代码");模型=reader.GetAttribute("模型");Name=reader.GetAttribute("姓名");如果(reader.ReadToDescendant("Image")&&reader.HasAttributes)ImageUri=newUri(reader.GetAttribute("Src"));}publicvirtualvoidWriteXml(XmlWriterwriter){writer.WriteAttributeString("Code",Code);writer.WriteAttributeString("模型",模型);writer.WriteAttributeString("姓名",姓名);如果(ImageUri!=null){writer.WriteStartElement("图像");writer.WriteAttributeString("Src",ImageUri.AbsoluteUri);writer.WriteEndElement();你在xml中得到这样的东西:Uri类实际上发现了ISerializable接口,因此它应这可以处理序列化/反序列化实现和IDeserializationCallback并使用字段本身。http://msdn.microsoft.com/en-us/library/system.runtime.serialization.ideserializationcallback.aspxUri已经是可序列化的,所以我认为您不必做任何事情。http://msdn.microsoft.com/en-us/library/system.uri(VS.80).aspx以上是C#学习教程:如何(xml)序列化uri共享的所有内容,如果是对大家有用并且需要了解更多C#学习教程,希望大家多多关注~本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处: