【问题标题】:Type 'MyClass' cannot inherit from a type that is not marked with DataContractAttribute or SerializableAttribute. Consider marking the base type类型“MyClass”不能继承自未使用 DataContractAttribute 或 SerializableAttribute 标记的类型。考虑标记基本类型
【发布时间】:2013-08-29 01:37:42
【问题描述】:

当我尝试序列化派生自 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);
    }
}

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

如何将MyOwnTableEntity中传递给ReadEntityWriteEntity的参数转发到实际TableEntity类中的ReadEntityWriteEntity方法?

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

编辑TableEntity.cs

【问题讨论】:

  • 你对TableEntity类有控制权还是代码生成的?
  • 嗨,不,我无法控制它。它来自微软。查看命名空间:Microsoft.WindowsAzure.Storage.Table.TableEntity.
  • 还有其他人可以帮助我吗?

标签: c# interface azure-storage datacontractserializer


【解决方案1】:

回到 MSSQL 并放弃 Azure 表存储作为解决方案。只是因为它有太多的限制。

【讨论】:

    【解决方案2】:

    一种方法是覆盖它:

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

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

    【讨论】:

    • 嗨,我需要覆盖什么?我在哪里应用IgnoreDataMember 属性?
    • @Yustme,你把我提供给你的那行代码放在MyClass中。然后你装饰那个。看,通过发出 new 语句,您正在覆盖基础中的内容,或者更具体地说,隐藏。
    • 我测试了你的方法,但我得到了同样的错误信息。此外,我收到此警告消息:“警告 'MyClassAsByte.PostAsByte' 不会隐藏继承的成员。不需要新关键字。”
    • @Yustme,它让你知道它没有隐藏的事实意味着你没有正确设置它。显然,您在此处提供的代码不是应用程序中的代码。简而言之,通过在子类中创建具有相同定义的成员并发出new 关键字来隐藏TableEntity 类中的成员。做对了,我相信你会得到关于序列化的不同结果。
    • 我认为您误认为byte[] 不是TableEntity 类的一部分。这些类完全重新组合了我的情况,只是具有更少的属性。请注意,TableEntity 课程不是我的。有关 Windows Azure Table 的教程,请参阅此链接:windowsazure.com/en-us/develop/net/how-to-guides/table-services
    猜你喜欢
    • 2013-04-17
    • 2011-05-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多