我试图将对象写入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为空。任何人都知道为什么?
答案 0 :(得分:5)
所以答案似乎是DateTimeOffset不是用XmlSerializer(http://connect.microsoft.com/VisualStudio/feedback/details/288349/datetimeoffset-is-not-serialized-by-a-xmlserializer)序列化的。
解决方法似乎是创建可以序列化的属性(字符串或DateTime和int表示偏移量)或根据连接错误使用datacontract序列化程序。
这个问题有更多可能的解决方案。
答案 1 :(得分:3)
DateTimeOffset类型未设计为与。一起使用 XmlSerializer的。 XmlSerializer要求在一个类型中设计一个类型 特定的方式,以完全序列化(默认公共 构造函数,公共读/写成员等)。 .NET中的大多数类型 框架的设计并未考虑XmlSerializer。
相反,您应该使用DataContractSerializer来序列化它 输入XML。如果必须使用XmlSerializer,请考虑创建 您自己的类型与DateTime结合使用以正确序列化 您感兴趣的信息。
同一个线程也确定它是一个需要修复的bug,所以你可以试着找出它是否已经在.NET框架的更高版本中得到修复,如果你不是最新版本的话。
如果您仍然必须使用XmlSerializer,那么您可以在stackoverflow中找到another thread中的潜在解决方法。
如果我这样做,我会使用DataContractSerializer,特别是考虑到你使用的类型不是那么大。