当我尝试序列化派生自TableEntity
的实体时,收到此错误消息:
类型'MyClass'不能从未使用DataContractAttribute或SerializableAttribute标记的类型继承。考虑使用DataContractAttribute或SerializableAttribute标记基类型“Microsoft.WindowsAzure.Storage.Table.TableEntity”,或者从派生类型中删除它们。
错误信息非常清楚是什么问题。
所以我的问题是,我如何解决DataContractAttribute
类TableEntity
中没有装饰的问题?
代码:
[DataContract]
public class MyClass : MyOwnTableEntity
{
[DataMember]
public string Name { get; set; }
[DataMember]
public string Email { get; set; }
}
我需要将MyClass
序列化为byte[]
并将其保存到表存储中。
public class MyClassAsByteArray : MyOwnTableEntity
{
public byte[] SomeByteArray { get; set; }
}
如果有人建议如何将其序列化为byte[]
,请告知我们。
[编辑]
我决定创建自己的可序列化TableEntity
:
[DataContract]
public class MyOwnTableEntity : ITableEntity
{
private TableEntity te = new TableEntity();
public MyOwnTableEntity ()
{
}
public MyOwnTableEntity (string partitionKey, string rowKey)
{
this.PartitionKey = partitionKey;
this.RowKey = rowKey;
}
public string PartitionKey { get; set; }
public string RowKey { get; set; }
public DateTimeOffset Timestamp { get; set; }
public string ETag { get; set; }
public virtual void ReadEntity(IDictionary<string, EntityProperty> properties, OperationContext operationContext)
{
te.ReadEntity(properties, operationContext);
}
public virtual IDictionary<string, EntityProperty> WriteEntity(OperationContext operationContext)
{
return te.WriteEntity(operationContext);
}
}
然后我从这个类派生,但它无法将MyClass
和MyClassAsByteArray
的属性写入存储表。那是因为我创建了一个TableEntity
的新对象。
如何将ReadEntity
中传递给WriteEntity
和MyOwnTableEntity
的参数转发到实际ReadEntity
类中的WriteEntity
和TableEntity
方法?
微软已经编写了代码,所以我想阻止在这里重新发明轮子。
修改 见TableEntity.cs
答案 0 :(得分:1)
回到MSSQL并删除Azure Table Storage作为解决方案。仅仅因为它有太多的限制。
答案 1 :(得分:0)
一种方法是覆盖它:
public new byte[] SomeByteArray { get; set; }
然后您可以使用IgnoreDataMember
属性忽略它。