3

XmlSerializer日時プロパティを含むオブジェクトをシリアル化するためにを使用しています。

これは、生成された結果の次の例で正常にシリアル化されます。

<GuestUserLinkItemActivity>
<ActivityDateTime>2013-03-06T00:00:00+00:00</ActivityDateTime>
<ActivityMessage>Invitation email sent to guest.</ActivityMessage>
</GuestUserLinkItemActivity>

しかし、再びを使用して逆シリアル化しようとするとXmlSerializer、次のエラーが発生します

文字列「2013-03-06T00:00:00 00:00」は有効なAllXsd値ではありません。xmlserializer Deserialize

同様の問題で私が見つけたいくつかの投稿がありますが、これに対する解決策を提供していません。

XmlSerializer:文字列''は有効なAllXsd値ではありません

文字列「3/18/0910:16PM」は有効なAllXsd値ではありません

これは、予期しない形式で保存されている日付と、xml仕様で予期されている形式ではない記事の1つに関係している可能性があります。したがって、保存されている日付を手動で修正すると、適切に逆シリアル化できると思います。

を使用して日付を正しく保存するにはどうすればよいですかXmlSerializer

以下のコピーおよび貼り付けられたコードのビットを参照してください。

public class GuestUserLinkItemActivity
{
public DateTime ActivityDateTime { get; set; }
    public string ActivityMessage { get; set; }
}

シリアライザークラス:

public static class Serializer
{

    public static T DeSerialise<T>(string contentsToDesrialise)
    {
        if (string.IsNullOrEmpty(contentsToDesrialise))
            return default(T);

        var xmlSer = new XmlSerializer(typeof(T));
        var stream = new MemoryStream();
        var sw = new StreamWriter(stream);
        sw.Write(contentsToDesrialise);
        sw.Flush();
        stream.Position = 0;
        var obj = (T)xmlSer.Deserialize(stream);
        sw.Close();
        stream.Close();
        return obj;
    }

    public static string Serialise<T>(T obectToSerialise)
    {
        var ms = new MemoryStream();
        var sr = new XmlSerializer(typeof(T));
        sr.Serialize(ms, obectToSerialise);
        ms.Position = 0;
        var sread = new StreamReader(ms);
        var serialisedObjectString = sread.ReadToEnd();
        sread.Close();
        ms.Close();
        return serialisedObjectString;
    }
}

使用法:

var guestHistoryList = new List<GuestUserLinkItemActivity>();
guestHistoryList.Add(new GuestUserLinkItemActivity(){
                         ActivityDateTime = DateTime.Now, 
                         ActivityMessage = "Invitation email sent to guest."}
);

var serialisedArray = Serializer.Serialise<GuestUserLinkItemActivity[]>(guestHistoryList.ToArray());
var deserialisedObject = Serializer.DeSerialise<GuestUserLinkItemActivity[]>(serialisedArray);
4

1 に答える 1

1

配列をシリアル化/逆シリアル化しようとする代わりに、試してみてください List<GuestUserLinkItemActivity>-それは私のために働きました:

var serialisedArray = Serializer.Serialise<List<GuestUserLinkItemActivity>>(guestHistoryList);
var deserialisedObject1 = Serializer.DeSerialise<List<GuestUserLinkItemActivity>>(serialisedArray);
于 2013-03-07T15:18:25.293 に答える