Comment sérialiser dateTime
De travail pour obtenir DateTimes pour n'importe quel fuseau horaire.
Je suis en utilisant DateTimeOffset, et une chaîne, et un XmlElement attribut. Quand je le fais, j'obtiens l'erreur suivante:
[InvalidOperationException: 'dateTime'
est une valeur non valide pour l'
XmlElementAttribute.Propriété type de données.
dateTime ne peut pas être converti à
Système.Chaîne de caractères.]
Système.Xml.La sérialisation.XmlReflectionImporter.ImportTypeMapping(TypeModel
modèle de Chaîne de ns, ImportContext
le contexte, le type de données Chaîne,
XmlAttributes un, Boolean répète,
Boolean openModel, RecursionLimiter
limiteur) +450[InvalidOperationException: Il n'y a
une erreur reflétant type
'Système.Chaîne'.]
Système.Xml.La sérialisation.XmlReflectionImporter.ImportTypeMapping(TypeModel
modèle de Chaîne de ns, ImportContext
le contexte, le type de données Chaîne,
XmlAttributes un, Boolean répète,
Boolean openModel, RecursionLimiter
limiteur) +1621
Système.Xml.La sérialisation.XmlReflectionImporter.ImportAccessorMapping(MemberMapping
accesseur, FieldModel modèle,
XmlAttributes une, Chaîne ns, Type
choiceIdentifierType, Boolean rpc,
Boolean openModel, RecursionLimiter
limiteur) +8750
Système.Xml.La sérialisation.XmlReflectionImporter.ImportFieldMapping(StructModel
parent, FieldModel modèle,
XmlAttributes une, Chaîne ns,
RecursionLimiter limiteur) +139
Système.Xml.La sérialisation.XmlReflectionImporter.InitializeStructMembers(StructMapping
cartographie, StructModel modèle Booléen
openModel, Chaîne typeName,
RecursionLimiter limiteur) +1273[InvalidOperationException: Il n'y a
une erreur reflétant la propriété
'creationTimeX'.] ...
Code:
[System.Xml.Serialization.XmlElement(ElementName = "creationTime",
DataType="dateTime")]
public string creationTimeX
{
get
{
return this.creationTimeField.ToString("yyyy-MM-ddTHH:mm:sszzz");
}
set
{
DateTimeOffset.TryParse(value, out this.creationTimeField);
}
}
[System.Xml.Serialization.XmlIgnoreAttribute()]
public System.DateTimeOffset creationTime
{
get {
return this.creationTimeField;
}
set {
this.creationTimeField = value;
}
}
DateTimeOffset
. Il y a quelques problèmes de sérialisation DateTimeOffset
lors de l'utilisation de WCF la sérialisation.OriginalL'auteur david valentine | 2008-11-21
Vous devez vous connecter pour publier un commentaire.
Prendre un coup d'oeil à ce StackOverflow question à propos de la sérialisation des dates et de l'heure UTC:
Les meilleures pratiques pour le type DateTime de sérialisation .Net framework 3.5/SQL Server 2008
Pas besoin de créer une propriété spéciale juste pour accomplir la sérialisation.
UTC est l'ancienne manière (assurez-vous que sérialise), mais ne répond pas à la question sur la sérialisation DateTimeOffset (avec le temps de la zone pertinente). Lire l'article MSDN sur le sujet, la recommandation actuelle de Microsoft est DateTimeOffset pour le traitement/stockage et TimeZoneInfo pour les calculs n'importe où les fuseaux horaires sont impliqués: msdn.microsoft.com/en-us/library/bb384267(v=vs. 110).aspx Seules options sont à utiliser un autre sérialiseur (DataContract ou NetDataContract), ajouter des propriétés comme la solution de contournement que j'ai ajoutée à la connexion MS article, ou faire votre propre structure avec l'UTC et l'ID de fuseau horaire, mais c'est moins standard
OriginalL'auteur Jason Jackson
C'est ce qui a fonctionné pour moi
OriginalL'auteur jhilden
Utiliser le XmlConvert.ToDateTimeOffset() et .ToString() méthodes correctement sérialiser et désérialiser un DateTimeOffset dans un XmlSerializer solution de contournement de la propriété.
Totalité de l'échantillon dans le Microsoft Connect article ici, et la confirmation que, malheureusement, Microsoft ne sera pas corrigé cet oubli (il doit avoir été pris en charge nativement par XmlSerializer comme n'importe quel type primitif):
https://connect.microsoft.com/VisualStudio/feedback/details/288349/datetimeoffset-is-not-serialized-by-a-xmlserializer
OriginalL'auteur Tony Wall
Je vous suggère de sérialiser DateTime comme un long (qui est ce que la mise en œuvre utilise en interne pour stocker la valeur réelle).
Vous pouvez utiliser
DateTime.Ticks
pour obtenir la valeur et il a un constructeur qui prend un long (Int64
).OriginalL'auteur Asher
David
Le type de données de la propriété(creationTimeX) est une chaîne alors que le XmlSerialization type de données est "dateTime". C'est pourquoi vous obtenez cette exception.
Vous pouvez résoudre ce problème en Changeant le type de données DateTime
Aussi pour votre problème de l'heure actuelle pour n'importe quel fuseau horaire, vous devez appliquer une
DateTime.Maintenant.ToUniveralTime et DateTimeFormat modèle sur elle.
Les étapes sont ici
http://msdn.microsoft.com/en-us/library/k494fzbf.aspx
Merci
-RVZ
OriginalL'auteur user35559
C'est 2019, et j'ai trouvé un super script unique pour un type personnalisé & propriété tiroir
UDateTime
de cette gistOriginalL'auteur nipunasudha