Guideline: Use .NET’s System.Xml.XmlConvert to generate a lexical representation of xs:duration when the binding is to a type of System.string.
javax.xml.datatype.Duration maps to xs:duration. .NET maps xs:duration to a different datatype for DataContractSerializer and XmlSerializer.
DataContractSerializer binds xs:duration to .NET System.TimeSpan.
XmlSerializer binds xs:duration to .NET System.string.
When xs:duration is bound to .NET System.string, the string value must be a lexical representation for xs:duration. .NET provides utility System.Xml.XmlConvert for this purpose.
Example: Mapping xs:duration using DataContactSerializer
//-- Java code fragment
public class PurchaseReport {
public javax.xml.datatype.Duration period;
}
//-- Schema fragment
<xs:complexType name="purchaseReport">
<xs:sequence>
<xs:element name="period" type="xs:duration" minOccurs="0"/>
</xs:sequence>
</xs:complexType>
//-- .NET auto generated code from schema
//-- Using svcutil.exe /serializer:DataContractSerializer <wsdl file>
public partial class purchaseReport: object,
System.Runtime.Serialization.IExtensibleDataObject
{
private System.TimeSpan periodField;
//-- ..... other generated code ........
public System.TimeSpan period
{
get { return this.periodField; }
set { this.periodField = value; }
}
}
//-- C# code fragment
purchaseReport tmpR = new purchaseReport();
tmpR.period = new System.TimeSpan.MaxValue;
Example: Mapping xs:duration using XmlSerializer
//-- .NET auto generated code from schema
//-- Using svcutil.exe /serializer:XmlSerializer <wsdl file>
public partial class purchaseReport
{
private string periodField;
public string period
{
get { return this.periodField; }
set { this.periodField = value; }
}
}
//-- C# code fragment
purchaseReport tmpR = new purchaseReport();
tmpR.period = System.Xml.XmlConvert.ToString(new System.TimeSpan(23, 0,0));