簡體   English   中英

將對象集中到Azure Blob存儲

[英]seralizing object to Azure Blob Storage

我試圖將對象寫入azure blob以進行持久存儲,並且由於某種原因,1屬性從未被序列化,我不確定為什么。

這是對象

[Serializable]
public class BlobMetaData
{
    public DateTimeOffset? ModifiedDate { get; set; }
    public string ContentType { get; set; }
    public string Name { get; set; }
    // size of the file in bytes
    public long Length { get; set; }
}

這是將數據保存到Azure存儲的功能。

public void Save(string filename,BlobProperties blobProperties)
{
    //full path to the blob
    string saveFile = _clientDirectory + filename;
    CloudBlockBlob blockBlob = _blobContainer.GetBlockBlobReference(saveFile);
    //blobMetaData properly gets all the right values.
    BlobMetaData blobMetaData = ConvertBlobProperties(blobProperties,filename);
    // I convert it to a stream
    MemoryStream stream = SerializeToStream(blobMetaData);
    blockBlob.UploadFromStream(stream);
}

這是我如何序列化數據。

    private MemoryStream SerializeToStream(BlobMetaData blobMetaData)
    {
        XmlSerializer serializer = new XmlSerializer(typeof(BlobMetaData));
        MemoryStream stream = new MemoryStream();
        serializer.Serialize(XmlWriter.Create(stream), blobMetaData);
        stream.Seek(0, SeekOrigin.Begin);
        return stream;
    }

由於某種原因..所有值都正確存儲在Azure XML中,除了ModifiedDate ..它總是空白,即使在我調用SerializeToStream()之前我檢查blobMetaData並且它確實具有值..因此它在序列化過程中丟失。

這是XML的樣子

<?xml version="1.0" encoding="utf-8"?><BlobMetaData   
xmlns:xsd="http://www.w3.org/2001/XMLSchema"   
xmlns:xsi="http://www.w3.org/2001/XMLSchema- 
instance"><ModifiedDate /><ContentType>application/octet-stream</ContentType><Name>u_ex14060716.log</Name><Length>652</Length></BlobMetaData>

正如您所見,modifiedDate為空。 任何人都知道為什么?

所以答案似乎是DateTimeOffset不是用XmlSerializer序列化的( http://connect.microsoft.com/VisualStudio/feedback/details/288349/datetimeoffset-is-not-serialized-by-a-xmlserializer ) 。

解決方法似乎是創建可以序列化的屬性(字符串或DateTime和int用於偏移)或根據連接錯誤使用datacontract序列化程序。

這個問題有更多可能的解決方案。

我如何XML序列化DateTimeOffset屬性?

來自Microsoft支持:

DateTimeOffset類型未設計為與XmlSerializer一起使用。 XmlSerializer要求以特定方式設計類型以完全序列化(默認公共構造函數,公共讀取/寫入成員等)。 .NET Framework中的大多數類型都沒有考慮到XmlSerializer而設計。

相反,您應該使用DataContractSerializer將此類型序列化為XML。 如果必須使用XmlSerializer,請考慮與DateTime一起創建自己的類型,以正確序列化您感興趣的信息。

同一個線程也確定它是一個需要修復的bug,所以你可以試着找出它是否已經在.NET框架的更高版本中得到修復,如果你不是最新版本的話。

如果您仍然必須使用XmlSerializer,那么您可以在stackoverflow的另一個線程中找到潛在的解決方法。

如果我這樣做,我會使用DataContractSerializer,特別是考慮到你使用的類型不是那么大。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM