通过创建新基类并废弃派生类来删除DataMember

时间:2012-01-18 19:23:54

标签: c# .net xml-serialization datacontractserializer

我有一个课程,我不想再使用了。我已经创建了一个基类,并使我的过时类成为新基类的一个子类。

数据方面,两个类之间的唯一区别是单个DataMember属性。

我有一个类,它具有在属性(也是DataMember)中引用派生类的属性。我已经用基类替换了那个类型。

在反序列化时,我收到错误消息反序列化对象,其中没有在流中找到引用ID'iXX'。

如果我将DataMember从派生类移动到基类。例外情况消失了。

我知道我无法修改DataContract。我希望创建一个新的课程,并允许其他过时的课程随着时间的推移而脱落。

我可以这样做吗?为什么我会得到这个例外?

*编辑: 当涉及继承时,看起来xml元素具有type属性。我猜这就是反序列化失败的原因。

**编辑:

使用此序列化:

[DataContract(IsReference = true)]
public class DerivedType    
{
    [DataMember]
    public Dictionary<object,object> DataMemberThatIDoNotNeed { get; set; }
}

[DataContract(IsReference = true)]
public class Class1
{
    [DataMember]
    //Previously was DerivedType before BaseType was introduced
    public DerivedType MyBaseType { get; set; }      
}

然后,用这个反序列化:

[DataContract(IsReference = true)]
[KnownType(typeof(DerivedType))]
public class BaseType
{

}

[DataContract(IsReference = true)]    
public class DerivedType : BaseType
{
    [DataMember]
    public Dictionary<object,object> DataMemberThatIDoNotNeed { get; set; }
}

[DataContract(IsReference = true)]
public class Class1
{
    [DataMember]
    //Previously was DerivedType before BaseType was introduced
    public BaseType MyBaseType { get; set; }
}

1 个答案:

答案 0 :(得分:0)

好吧,我用你的对象执行了以下代码:

var class1 = new Class1 {MyBaseType = new DerivedType()};

var serializer = new DataContractSerializer(typeof (Class1));
serializer.WriteObject(File.Create(filename), class1);

然后我将Class1更改为:

[DataContract(IsReference = true)]
public class Class1
{
    [DataMember]
    public DerivedType MyBaseType { get; set; }
}

并且以下代码仍然有效:

var readObject = new DataContractSerializer(typeof (Class1)).ReadObject(File.OpenRead(filename));

readObject.Should().NotBeNull(); // it is not null

也许您需要显示序列化代码以添加更多细节。