Как изменить сериализованный формат данных времени?C#

Место общения программистов C#
Ответить
Anonymous
 Как изменить сериализованный формат данных времени?

Сообщение Anonymous »

У меня есть приложение C# .NET 4.5.1 Windows Forms, в котором мне нужно сериализовать объект в XML-файл. Класс объекта был создан с помощью внешнего инструмента, и его больше не следует модифицировать. Данные времени из объекта сериализуются следующим образом:
10:35:59.0000000+01:00

и мне это нужно в формате ЧЧ:мм:сс, например:
10:35:59

Поскольку базовый класс не является виртуальным, я не могу его переопределить, поэтому я попытался скрыть его с помощью нового класса, однако получаю исключение InvalidOperationException:
System.InvalidOperationException
HResult=0x80131509
Message=There was an error reflecting type 'UblInvoice.InvoiceType'.
Source=System.Xml
StackTrace:
at System.Xml.Serialization.XmlReflectionImporter.ImportTypeMapping(TypeModel model, String ns, ImportContext context, String dataType, XmlAttributes a, Boolean repeats, Boolean openModel, RecursionLimiter limiter)
at System.Xml.Serialization.XmlReflectionImporter.ImportElement(TypeModel model, XmlRootAttribute root, String defaultNamespace, RecursionLimiter limiter)
at System.Xml.Serialization.XmlReflectionImporter.ImportTypeMapping(Type type, XmlRootAttribute root, String defaultNamespace)
at System.Xml.Serialization.XmlSerializer..ctor(Type type, String defaultNamespace)
at System.Xml.Serialization.XmlSerializer..ctor(Type type)
at UblInvoice.Program.Main(String[] args) in C:\Temp\ConsoleApp2\ConsoleApp2\Program.cs:line 19

This exception was originally thrown at this call stack:
[External Code]

Inner Exception 1:
InvalidOperationException: There was an error reflecting property 'IssueTime'.

Inner Exception 2:
InvalidOperationException: There was an error reflecting type 'UblInvoice.IssueTimeType'.

Inner Exception 3:
InvalidOperationException: There was an error reflecting property 'Value'.

Inner Exception 4:
InvalidOperationException: Member IssueTimeType.Value of type System.String hides base class member TimeType.Value of type System.DateTime. Use XmlElementAttribute or XmlAttributeAttribute to specify a new name.

Вот выдержка из сгенерированного XSD класса (он большой, поэтому я добавляю только нужные фрагменты):
///
[System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.8.3928.0")]
[System.SerializableAttribute()]
[System.Diagnostics.DebuggerStepThroughAttribute()]
[System.ComponentModel.DesignerCategoryAttribute("code")]
[XmlTypeAttribute(Namespace="urn:oasis:names:specification:ubl:schema:xsd:CommonBasicComponents-2")]
[XmlRootAttribute("IssueTime", Namespace="urn:oasis:names:specification:ubl:schema:xsd:CommonBasicComponents-2", IsNullable=false)]
public partial class IssueTimeType : TimeType {
}

///
[XmlIncludeAttribute(typeof(IssueTimeType))]
[System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.8.3928.0")]
[System.SerializableAttribute()]
[System.Diagnostics.DebuggerStepThroughAttribute()]
[System.ComponentModel.DesignerCategoryAttribute("code")]
[XmlTypeAttribute(Namespace="urn:oasis:names:specification:ubl:schema:xsd:UnqualifiedDataTypes-2")]
public partial class TimeType {

private System.DateTime valueField;

///
[XmlTextAttribute(DataType="time")]
public System.DateTime Value {
get {
return this.valueField;
}
set {
this.valueField = value;
}
}
}

Вот мой воспроизводимый код:
internal class Program
{
static void Main(string[] args)
{
InvoiceType o = new InvoiceType();

o.IssueTime = new IssueTimeType()
{
Value = (new DateTime(2000, 1, 1, 15, 30, 0, 123)).ToString()
};

XmlSerializer s = new XmlSerializer(typeof(InvoiceType));
XmlTextWriter w = new XmlTextWriter(@"C:\temp\test.xml", Encoding.UTF8);
w.Formatting = Formatting.Indented;
s.Serialize(w, o);
w.Close();
}
}

public partial class IssueTimeType : TimeType
{
[XmlTextAttribute(DataType = "string")]
public new string Value
{
get
{
return base.Value.ToString("HH:mm:ss");
}
set
{
base.Value = DateTime.Parse(value);
}
}
}


Подробнее здесь: https://stackoverflow.com/questions/798 ... -time-data
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»