Chr*_*ris 33 c# xml-serialization
在C#中,我有一个类,它有一个派生属性,应该通过XML序列化.但是,XML序列化(默认情况下)不会序列化read = only属性.我可以通过定义一个空的setter来解决这个问题:
public virtual string IdString
{
get { return Id.ToString("000000"); }
set { /* required for xml serialization */ }
}
Run Code Online (Sandbox Code Playgroud)
但是,除了编写自己的ISerializable实现之外,还有一种更清晰,语义更正确的方法吗?
Jus*_*tin 19
老实说,只要记录在案,这对我来说似乎并不太糟糕
如果实际调用了setter,你应该抛出异常:
/// <summary>
/// Blah blah blah.
/// </summary>
/// <exception cref="NotSupportedException">Any use of the setter for this property.</exception>
/// <remarks>
/// This property is read only and should not be set.
/// The setter is provided for XML serialisation.
/// </remarks>
public virtual string IdString
{
get
{
return Id.ToString("000000");
}
set
{
throw new NotSupportedException("Setting the IdString property is not supported");
}
}
Run Code Online (Sandbox Code Playgroud)
Mar*_*ell 14
简而言之,没有.有了XmlSerializer你可以实现IXmlSerializable(这是不平凡的),或者写一个基本的DTO(即完全读写),然后从DTO模式,你的主模型转换.
请注意,在某些情况下 DataContractSerializer是可行的选项,但它不提供对XML的相同控制.但是,使用DCS,您可以:
[DataMember]
public int Id { get; private set; }
Run Code Online (Sandbox Code Playgroud)
对于 C# 8,set允许废弃,因此您可以这样做:
public virtual string IdString
{
get { return Id.ToString("000000"); }
[Obsolete("Only used for xml serialization", error: true)]
set { throw new NotSupportedException(); }
}
Run Code Online (Sandbox Code Playgroud)
如果有人不小心使用了 setter,这将会出错。
| 归档时间: |
|
| 查看次数: |
20932 次 |
| 最近记录: |