类型“MyClass”不能从未使用DataContractAttribute或SerializableAttribute标记的类型继承。考虑标记基本类型

时间:2013-08-26 14:13:16

标签: c# interface azure-storage datacontractserializer

当我尝试序列化派生自TableEntity的实体时,收到此错误消息:

  

类型'MyClass'不能从未使用DataContractAttribute或SerializableAttribute标记的类型继承。考虑使用DataContractAttribute或SerializableAttribute标记基类型“Microsoft.WindowsAzure.Storage.Table.TableEntity”,或者从派生类型中删除它们。

错误信息非常清楚是什么问题。

所以我的问题是,我如何解决DataContractAttributeTableEntity中没有装饰的问题?

代码:

[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);
    }
}

然后我从这个类派生,但它无法将MyClassMyClassAsByteArray的属性写入存储表。那是因为我创建了一个TableEntity的新对象。

如何将ReadEntity中传递给WriteEntityMyOwnTableEntity的参数转发到实际ReadEntity类中的WriteEntityTableEntity方法?

微软已经编写了代码,所以我想阻止在这里重新发明轮子。

修改TableEntity.cs

2 个答案:

答案 0 :(得分:1)

回到MSSQL并删除Azure Table Storage作为解决方案。仅仅因为它有太多的限制。

答案 1 :(得分:0)

一种方法是覆盖它:

public new byte[] SomeByteArray { get; set; }

然后您可以使用IgnoreDataMember属性忽略它。