C#UniqueId类XML反序列化
我正在尝试从XML文件反序列化C#UniqueId类XML反序列化,c#,xml,deserialization,C#,Xml,Deserialization,我正在尝试从XML文件反序列化urn:uuid:a0a32a4f-9687-46ef-bdc7-e4ab049ac56f。我的文件样本是 比利 urn:uuid:a0a32a4f-9687-46ef-bdc7-e4ab049ac56f 我正在尝试反序列化到下面的类中 公共类文档 { 公共字符串名称{get;set;} 公共唯一ID TheId{get;set;} } 我的完整演示代码: [可序列化] 公共类文档 { 公共字符串名称{get;set;} 公共唯一ID TheId{get;se
urn:uuid:a0a32a4f-9687-46ef-bdc7-e4ab049ac56f
。我的文件样本是
比利
urn:uuid:a0a32a4f-9687-46ef-bdc7-e4ab049ac56f
我正在尝试反序列化到下面的类中
公共类文档
{
公共字符串名称{get;set;}
公共唯一ID TheId{get;set;}
}
我的完整演示代码:
[可序列化]
公共类文档
{
公共字符串名称{get;set;}
公共唯一ID TheId{get;set;}
}
班级计划
{
静态void Main(字符串[]参数)
{
字符串Xml=@“
比利
urn:uuid:a0a32a4f-9687-46ef-bdc7-e4ab049ac56f
";
XmlReader=XmlReader.Create(新的StringReader(Xml));
XmlSerializer serializer=新的XmlSerializer(typeof(Document));
文档文档=(文档)序列化程序。反序列化(读取器);
WriteLine(“名称为:{0}”,doc.Name);
WriteLine(“Id是:{0}”,doc.TheId);
Console.ReadKey();
}
}
但每次我都会得到新的uniquid,而不是存储在XML文档中的值
我做错了什么
UPD:
UniqueId
类位于System.Runtime.Serialization程序集中
我的最终目标是将此值放入Guid
,我想这是使用UniqueId::TryGetGuid
简单解决方案:
public class Document
{
public string Name { get; set; }
[EditorBrowsable(EditorBrowsableState.Never)]
[XmlElement("TheId")]
public string TheIdString { get => TheId.ToString(); set => TheId = new UniqueId(value); }
[XmlIgnore]
public UniqueId TheId { get; set; }
}
添加一个不同的string
属性,该属性将被序列化/反序列化,并使其支持的“field”成为唯一的id
(我认为这是适配器模式,但不确定)
通过查看的源代码,我看不到对XmlSerializer
的特殊处理,比如IXmlSerializable
接口。也没有任何文档说明它与XmlSerializer
兼容
啊。。。
[EditorBrowsable(EditorBrowsableState.Never)]
是这样的,Intellisense不会建议您使用uniqueIdImpl
属性。它位于System.Runtime.Serialization
程序集中。这会导致问题吗?@xanatos-我可以复制这个(核心2.0)。顺便说一下,这是一个很好的mcve问题。我很惊讶,您会期望System.Xml
中的类型是XmlSerizalizable。但它也不会写。@xanatos:Hmmm。。。。我仍然可以用4.7.1重现这个问题……谢谢,我在提出问题之前已经考虑过这个解决方案。你的执行比我的更整洁。但我真的很好奇,UniqueId
类为什么会发生这种情况@AleksandrGorbach它是由XmlReader
支持的,但可能他们(微软程序员)从未想过在XmlSerializer
中直接支持它,如果没有XmlSerializer
的直接支持,UniqueId
将需要“手动”支持,而这应该由UniqueId
实现。没有这种支持。