2011-08-09 5 views
1

私は、xsに変換するbcl.DateTime要素をしたいと思います:XPathDocumentオブジェクトprotobuf-net:bcl.DateTime to xs:dateTime?

の日時これはissue #69

に関連するかもしれない、私はこの

test.proto

のような小さなテストプロジェクトを作成しました
import "bcl.proto"; 

message Test { 
    required bcl.DateTime tAsOf = 1;  
} 

Program.csの

using System; 
using System.IO; 
using System.Xml; 
using System.Xml.Serialization; 
using System.Xml.XPath; 
using ProtoBuf; 
using test; 

namespace DateTimeXML 
{ 
    class Program 
    { 
     static void Main() 
     { 
      var d = new bcl.DateTime() {value = new DateTime(2011, 7, 31).Ticks}; 
      var t = new Test() {tAsOf = d}; 
      var xml = Serialize(t); 
      WriteXpathDocument(xml, "c:\\temp\\xpathdoc.xml"); 
     } 

     private static XPathDocument Serialize(Test obj) 
     { 
      XPathDocument xmlDoc; 
      Serializer.PrepareSerializer<Test>(); 

      var x = new XmlSerializer(obj.GetType()); 
      using (var memoryStream = new MemoryStream()) 
      { 
       using (TextWriter w = new StreamWriter(memoryStream)) 
       { 
        x.Serialize(w, obj); 
        memoryStream.Position = 0; 
        xmlDoc = new XPathDocument(memoryStream); 
       } 
      } 
      return xmlDoc; 
     } 

     private static void WriteXpathDocument(XPathDocument xpathDoc, string filename) 
     { 
      // Create XpathNaviagtor instances from XpathDoc instance. 
      var objXPathNav = xpathDoc.CreateNavigator(); 

      // Create XmlWriter settings instance. 
      var objXmlWriterSettings = new XmlWriterSettings(); 
      objXmlWriterSettings.Indent = true; 

      // Create disposable XmlWriter and write XML to file. 
      using (var objXmlWriter = XmlWriter.Create(filename, objXmlWriterSettings)) 
      { 
       objXPathNav.WriteSubtree(objXmlWriter); 
       objXmlWriter.Close(); 
      } 
     } 
    }  
} 

それは次のXMLファイルを作成します。

<?xml version="1.0" encoding="utf-8"?> 
<Test xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 
    <tAsOf> 
    <value>634476672000000000</value> 
    </tAsOf> 
</Test> 
+0

日時をUTLの日付文字列で送信する必要があります(例:2006-01-01T00:00:00Z )。http://code.google.com/apis/gdata/docs/2.0/elements.html – Damian

+0

申し訳ありませんが遅れました;これは私が過ぎ去りました) –

答えて

0

興味深いです。 bcl.DateTimeタイプは実際には内部フォーマットDateTimeを表すことを意図しており、実際に直接使用することは意図されていません。私はおそらくそれが翻訳中DateTimeとしてbcl.DateTimeを解釈するために修正する必要がありますが、ここではより典型的使い方は(あなたがそのようなDateTimeなどの.NETタイプ、について話しているので)

[ProtoContract] 
class Test { 
    [ProtoMember(1, IsRequired = true)] 
    public DateTime AsOf {get;set;} 
} 

すなわち、コード最初のだろう、このprotobufとxs目的の両方で必要に応じて動作するはずです。

ここに.protoが必要ですか?私はそれにパッチを当てることができます、私はちょうどそれが必要かどうかを知りたいです。コメント/更新日時


、および.protoを使用して再 - 私は強く時間値のための最も基本的な共通のフォーマットを使用することをお勧めし - おそらくlong(または多分string)、およびいずれか使用シム部分クラスのプロパティを使用して、DateTimeの値をxsに公開するか、またはprotobuf/xsのアスペクトとマップを表す別のDTOを使用します(おそらく良い方)。 .protoはプラットフォーム間でbcl.DateTimeを愛しません。

+0

理想的には、私は.protoの中身を指定する必要がありますが、すぐに問題がプロトコルバッファの言語実装に表示されます。すべての日付/時刻をUTL(Coordinated Universal Time)形式で指定し、ユーザーがそれらを表示したいときにローカルタイムゾーンに変換を適用するように選択しました。 – Damian

+0

@ user800454ああ、右 - 私はより良い選択肢がある...更新されます –