DOBON.NETプログラミング道掲示板
(現在 過去ログ1 を表示中)

[ 最新記事及び返信フォームをトピックトップへ ]

■33314 / inTopicNo.1)  ミリ秒とGMTなしでのDateTimeのシリアル化
  
□投稿者/ end 一般人(1回)-(2016/03/28(Mon) 14:36:29)
  • アイコン環境/言語:[環境:windows7、使用言語:c#] 
    分類:[.NET] 

    お世話になります。

    c#開発の初心者ですが、Data Timeをシリアル化する場合について、
    皆様のお知恵をお貸しいただけますでしょうか。

    <課題>
    XSDファイルを使用してC#クラスファイルを作成したクラスで、
    Data Time型をシリアル化すると、
    ファイルの内容は次のようになります.
    "14:04:02.1661975+02:00"

    これを、
    "14:04"
    にする方法はありませんでしょうか。

    具体的には
    1.XSDファイルから以下のC#クラスファイルを作成しました。

    private System.DateTime timeField;

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

      set
      {
          this.timeField = value;
      }
    }

    2.1.のクラスでシリアル化すると、ファイルの内容は次のようになります.
    <Time>14:04:02.1661975+02:00</Time>

    3.これを、
    <Time>14:04</Time>
    のようにするには、何か方法がありますか。

    以上、よろしくお願い致します。
引用返信 削除キー/
■33315 / inTopicNo.2)  Re[1]: ミリ秒とGMTなしでのDateTimeのシリアル化
□投稿者/ Hongliang 大御所(513回)-(2016/03/28(Mon) 15:34:19)
  • アイコン
    // ミリ秒どころか秒も消えているようですが…。
    標準では対応できないので、IXmlSerializableを実装して
    シリアライズのカスタマイズを行うことになるでしょう。
    
    あるいは、
    public string Time {
        get { return this.timeField.ToString("HH:mm"); }
        set { this.timeField = Time.ParseExact(value, "HH:mm", CultureInfo.InvariantCulture); }
    }
    [NonSerialized]
    public DateTime TimeValue {
        get { return this.timeField; }
        set { this.timeField = value; }
    }
    のように、シリアライズ専用のプロパティを追加するか。
    // Time::setは入力チェックを省略しています。

引用返信 削除キー/
■33316 / inTopicNo.3)  Re[2]: ミリ秒とGMTなしでのDateTimeのシリアル化
□投稿者/ end 一般人(2回)-(2016/03/28(Mon) 19:58:46)
  • アイコンHongliang様

    お世話になります。
    ご回答いただき、誠に有難う御座います。
    ご指摘の通り、秒も必要がなく「時:分」でシリアライズを
    行いたく考えております。

    そこで、教えていただいたシリアライズ専用のプロパティの追加にて対応をしたく、
    以下につきのお知恵をお貸しいただけますでしょうか。

    1.値のセットおよびゲットは、「Time」へ行えばよいでしょうか。
    &#160;「TimeValue」はどの様に使うのでしょうか。

    2.[NonSerialized]属性をつけると、
    「属性 'NonSerialized' は、この宣言型では無効です。'field' の宣言でのみ有効です。」とエラーになってしまいます。
    そこで「Field: NonSerialized」としたのですが、
    「'Field'は認識できる属性の場所ではありません。このブロック内の属性はすべて無視されます。」となってしまいます。
    「Field: NonSerialized」の記述は誤りでしょうか。

    お手数おかけしますが、よろしくお願い申し上げます。

引用返信 削除キー/
■33317 / inTopicNo.4)  Re[3]: ミリ秒とGMTなしでのDateTimeのシリアル化
□投稿者/ Hongliang 大御所(514回)-(2016/03/28(Mon) 22:18:26)
  • アイコン
    2016/03/28(Mon) 22:19:29 編集(投稿者)
    
    > 1.値のセットおよびゲットは、「Time」へ行えばよいでしょうか。
    > 「TimeValue」はどの様に使うのでしょうか。
    プログラムからは一般にTimeValueの方を使うのでは無いでしょうか。
    普段はDateTime型で扱っているんですよね?
    
    どちらかというとこういう形の方が扱いやすいかな?
    [XmlIgnore]
    public DateTime Time { 略 }
    [XmlElement("Time")]
    public string SerializedTime { 略 }
    
    > 2.[NonSerialized]属性をつけると、
    > 「属性 'NonSerialized' は、この宣言型では無効です。'field' の宣言でのみ有効です」
    > とエラーになってしまいます。
    すいません、間違いでした。
    XmlSerializerの場合は上記のようにXmlIgnore属性を使用してください。

引用返信 削除キー/



トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

Mode/  Pass/


- Child Tree -