序列化对象到Azure Blob存储

本文关键字:Blob 存储 Azure 对象 序列化 | 更新日期: 2023-09-27 18:08:40

我试图将对象写入azure blobs用于持久存储,并且由于某种原因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;
    }

由于某种原因…除了ModifiedDate之外,所有值都正确地存储在Azure XML中。它总是空白的,即使在我调用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为空。有人知道为什么吗?

序列化对象到Azure Blob存储

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

解决方案似乎是创建可以序列化的属性(字符串或DateTime和int表示偏移量),或者根据连接错误使用数据契约序列化器。

这个问题有很多可能的答案。

如何在XML中序列化DateTimeOffset属性?

From Microsoft Support:

DateTimeOffset类型不是设计为与XmlSerializer。XmlSerializer要求将类型设计为特定的方式,以便完全序列化(默认公开)构造函数,公共读/写成员等)。.NET中的大多数类型框架在设计时没有考虑到XmlSerializer。

相反,您应该使用DataContractSerializer来序列化它输入XML。如果必须使用XmlSerializer,请考虑创建您自己的类型与DateTime的组合,以正确序列化您感兴趣的信息。

同样的线程也把它确定为一个需要修复的bug,所以如果你不是最新的,你可以试着找出它是否在更高版本的。net框架中被修复了。

如果您仍然必须使用XmlSerializer,那么您可以在stackoverflow的另一个线程中找到潜在的解决方案。

如果我要这样做,我会使用DataContractSerializer代替,特别是考虑到您正在使用的类型不是那么大。