【问题标题】:Serializing DateTime to time without milliseconds and gmt在没有毫秒和 gmt 的情况下将 DateTime 序列化为时间
【发布时间】:2010-09-11 05:17:06
【问题描述】:

我使用 XSD 文件作为输入创建了一个 C# 类文件。我的一个属性如下所示:

 private System.DateTime timeField;

 [System.Xml.Serialization.XmlElementAttribute(DataType="time")]
 public System.DateTime Time {
     get {
         return this.timeField;
     }
     set {
         this.timeField = value;
     }
 }

序列化后,文件的内容现在如下所示:

<Time>14:04:02.1661975+02:00</Time>

是否可以通过属性上的 XmlAttributes 让它在没有毫秒和 GMT 值的情况下呈现?

<Time>14:04:02</Time>

这可能吗,还是我需要在类被序列化后组合某种 xsl/xpath-replace-magic?

这不是将对象更改为 String 的解决方案,因为它在应用程序的其余部分中用作 DateTime,并允许我们使用 XmlSerializer.Serialize() 方法从对象创建 xml 表示。

我需要从字段中删除额外信息的原因是接收系统不符合时间数据类型的 w3c 标准。

【问题讨论】:

标签: .net time xml-serialization attributes


【解决方案1】:

您可以创建一个字符串属性来执行与 timeField 字段之间的转换,并将序列化属性放在该属性上,而不是应用程序其余部分使用的真实 DateTime 属性。

【讨论】:

  • 我今天也必须做同样的事情 :)
  • 如果我们以后需要反序列化同一个文件,这也可以吗?
  • 我就是这样解决的。我可以接受这两个答案,但杰弗里是第一个。我能做的最好的就是投票:)
  • 如果你的 XSD 不会改变,我认为这是最简单的解决方案。
【解决方案2】:

将 [XmlIgnore] 放在 Time 属性上。

然后添加一个新属性:

[XmlElement(DataType="string",ElementName="Time")]
public String TimeString
{
    get { return this.timeField.ToString("yyyy-MM-dd"); }
    set { this.timeField = DateTime.ParseExact(value, "yyyy-MM-dd", CultureInfo.InvariantCulture); }
}

【讨论】:

  • "yyyy-MM-dd" 是时间字段的正确格式字符串吗?虽然这个解决方案对我来说不是开箱即用的,但它确实让我找到了一个可行的解决方案。我不得不使用"HH:mm:ss",并且我从我的dateField 中获得了这样的get { return this.dateField.ToString("HH:mm:ss"); }
  • Uri 数据类型也是如此。那是我的问题,这就是我解决它的方法。 [JsonIgnore] [XmlIgnore] public Uri UrlIgnore { get;放; } [JsonProperty("url")] [XmlElement] public string Url { get { return Convert.ToString(UrlIgnore); } 设置 { UrlIgnore = 新的 Uri(值); } }
猜你喜欢
  • 1970-01-01
  • 2021-04-01
  • 2020-10-13
  • 2018-01-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多