- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
当我有以下类并尝试使用 DataContractSerializer 序列化 ConcreteClass
实例时.WriteObject(..)
我收到一个 InvalidDataContractException
。
public abstract class AbstractClass
{
protected AbstractClass(string text) { }
}
public class ConcreteClass : AbstractClass
{
public ConcreteClass() : base("text") { }
}
序列化器使用new DataContractSerializer(typeof(ConcreteClass)
实例化。
使用XmlSerializer没有任何问题。
现在添加 public AbstractClass() {}
两个序列化器都可以工作。
那么为什么 DataContractSerializer 需要抽象基类具有无参数构造函数? Here据说可以序列化“具有不带参数的构造函数”的类型,这对于 ConcreteClass 来说是正确的。我还向这个必需的构造函数添加了一些代码,并且我认为在序列化过程中不会调用它。
<小时/>完整的异常说:
System.Runtime.Serialization.InvalidDataContractException : Type AbstractClass' cannot be serialized. Consider marking it with the DataContractAttribute attribute, and marking all of its members you want serialized with the DataMemberAttribute attribute. See the Microsoft .NET Framework documentation for other supported types.
如果我保留无参数构造函数并使用建议的属性,它甚至可以工作。那么为什么会有差异以及为什么要尝试序列化抽象类呢?当然,抽象类中可能有诸如属性之类的东西,但这些东西不应该与 ConcreteClass 实例(继承这些东西)一起序列化吗?
编辑:
我的确切代码:
namespace SerilizationTest
{
public abstract class AbstractClass
{
public string StringProperty { get; set; }
//This constructor is required (although never called).
//If not present we get "InvalidDataContractException :
//Type AbstractClass cannot be serialized"
public AbstractClass()
{
Console.WriteLine("We won't see this.");
}
public AbstractClass(string text)
{
StringProperty = text;
}
}
public class ConcreteClass : AbstractClass
{
public ConcreteClass() : base("text") { }
}
class Program
{
static void Main()
{
var serializer = new DataContractSerializer(typeof(ConcreteClass));
var memStream = new MemoryStream();
serializer.WriteObject(memStream, new ConcreteClass());
memStream.Seek(0, SeekOrigin.Begin);
var deserializedObj = (ConcreteClass)serializer.ReadObject(memStream);
Console.WriteLine(deserializedObj.StringProperty);
}
}
}
最佳答案
您得到的异常是,AbstractClass 上没有 [DataContract] 属性。
DataContract 是一个属性,用于标记可序列化的类。如果您使用 DataMember 属性告诉它这样做,则该属性只会包含类中要序列化的属性。
DataMember 属性用于标记可序列化类中需要哪些属性。
此属性可在 System.Runtime.Serialization 中找到;
例如...
public abstract class Bar
{
}
public class Foo : Bar
{
string one { get; set; }
string two { get; set; }
string three { get; set; }
}
如果我尝试序列化我的 Foo 类,那么我会得到你的异常(exception)。因此,如果我将 DataContract 属性添加到 Bar 类中,就像异常所暗示的那样,下次我尝试序列化时,我将得到相同的错误,只是指向代码的另一部分,即 Foo 类本身。我需要做的就是像这样将 DataContract 添加到两者中。
[DataContract]
public abstract class Bar
{
}
[DataContract]
public class Foo : Bar
{
string one { get; set; }
string two { get; set; }
string three { get; set; }
}
现在我们所拥有的将能够创建一个序列化文件。但是,不会有任何信息,因为我们从未告诉 DataContract 要包含哪些内容。为了解决此问题,我们将 DataMember 属性添加到我们要包含的类中的属性中。
[DataContract]
public class Foo : Bar
{
[DataMember]
string one { get; set; }
string two { get; set; }
[DataMember]
string three { get; set; }
}
通过在序列化此类时添加 DataMember 属性,它将仅序列化有关字符串一和字符串三的信息。字符串二不会被包含,因为它没有专门用 DataMember 属性标记。
关于c# - DataContractSerializer 需要抽象基类中的无参数构造函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6305315/
经过几个小时的(重新)搜索,我无法想出普通抽象类和使用模板模式之间的可解释区别。 我唯一看到的是: 使用抽象类时,您需要实现所有方法。但是在使用模板方法时,您只需要实现这两个抽象方法。 有人可以向我解
我正在尝试实现一种算法,该算法可找到以下形状给出的外多边形的每个单独边的对应区域。也就是说,1,2 边的相应区域是 [1,6,7,8,2],2,3 边的区域是 [2,8,3] 等等,CCW 或 CW
我正在尝试在派生 self 的 BaseController 类的任何 Controller 上自动设置一个属性。这是我的 Application_Start 方法中的代码。 UnitOfWork 属
我正在使用 mgcv 包通过以下方式将一些多项式样条拟合到一些数据: x.gam smooth$knots [1] -0.081161 -0.054107 -0.027053 0.000001
考虑以下代码: void foo(){ ..... } int main() { int arr[3][3] ; char string[10]; foo();
本书The c++ programming language有这个代码: class BB_ival_slider : public Ival_slider, protected BBslider {
是否有一个 package.json 属性可用于指定模块解析应启动的根文件夹? 例如,假设我们在 node_modules/mypackage/src/file1 中有一个安装。我们要导入的所有文件都
我正在尝试使用聚合函数来实现与 SQL 查询相同的结果: 查询语句: sqldf(" SELECT PhotoID, UserID,
我正在比较使用 LOESS 回归的两条线。我想清楚地显示两条线的置信区间,我遇到了一些困难。 我尝试过使用各种线型和颜色,但在我看来,结果仍然是忙碌和凌乱。我认为置信区间之间的阴影可能会使事情变得更清
给定这段代码 public override void Serialize(BaseContentObject obj) { string file = ObjectDataStoreFold
我正在构建某种工厂方法,它按以下方式将 DerivedClass 作为 BaseClass 返回: BaseClass Factory() { return DerivedClass(); }
当重写 class delegation 实现的接口(interface)方法时,是否可以调用通常从重写函数中委托(delegate)给的类?类似于使用继承时调用 super 的方式。 来自docum
我有一个基类 fragment (如下所示)。我在其他 3 个 fragment 类中扩展了此类,每个类都共享需要在这 3 个 fragment 中访问的相同 EditText。因此,我在基类中设置了
如何在不加载额外库的情况下在 R 中计算两个排列之间的 Kendall tau 距离(又名冒泡排序距离)? 最佳答案 这是一个 O(n.log(n)) 的实现,在阅读后拼凑而成,但我怀疑可能有更好的
情况 我创建了一个具有国际化 (i18n) 的 Angular 应用程序。我想在子域中托管不同的版本,例如: zh.myexample.com es.myexample.com 问题 当我使用命令 n
std::is_base_of 之间的唯一区别和 std::is_convertible是前者在 Base 时也成立是 私有(private)或 protected Derived 的基类.但是,您何
我创建了一个名为 baseviewcontroller 的父类(super class) uiviewcontroller 类,用于包含大多数应用屏幕所需的基本 UI。它包括一个自定义导航栏和一个“自
我是一名优秀的程序员,十分优秀!