- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试序列化,但我正面临 abstact 类的问题。
我用谷歌搜索答案,我找到了 this blogitem .
我试过那个和那个工作。
好的,很不错。但请查看对该项目的评论:
This methodology seems to be hiding the true problem and that is an inaccurate implementation of OO design patterns, namely the factory pattern.
Having to change the base class to reference any new factory class is self-defeating.
With a little after-thought, the code can be changed to where any derived type can be associated with the abstract class (through the miracle of interfaces) and no XmlInclude would be required.
I suggest further research into factory patterns which seems to be what you are trying to implement here.
factory pattern
the code can be changed to where any derived type can be associated with the abstract class (through the miracle of interfaces)
public interface IWorkaround
{
void Method();
}
public class SomeBase : IWorkaround
{
public void Method()
{
// some logic here
}
}
public class SomeConcrete : SomeBase, IWorkaround
{
public new void Method()
{
base.Method();
}
}
最佳答案
他既对又错。
诸如 BinaryFormatter
之类的东西,这不是问题;序列化流包含完整的类型元数据,因此如果您有:
[Serializable] abstract class SomeBase {}
[Serializable] class SomeConcrete : SomeBase {}
...
SomeBase obj = new SomeConcrete();
obj
,然后在流中包含“我是
SomeConcrete
”。这使生活变得简单,但很冗长,尤其是在重复时。它也很脆弱,因为它在反序列化时需要相同的实现;对不同的客户端/服务器实现或长期存储都不利。
XmlSerializer
(我猜博客正在谈论),没有元数据 - 但元素名称(或
xsi:type
属性)用于帮助识别使用的是哪个。为此,序列化程序
需要提前知道哪些名称映射到哪些类型。
<someConcreteType>
元素,映射到
SomeConcrete
实例(请注意,名称不需要匹配,因此不能仅按名称查找)。
[XmlInclude(typeof(SomeConcrete))]
public abstract class SomeBase {}
public class SomeConcrete : SomeBase {}
...
SomeBase obj = new SomeConcrete();
XmlSerializer ser = new XmlSerializer(typeof(SomeBase));
ser.Serialize(Console.Out, obj);
XmlSerializer
.例如,您可以从配置(或者可能是 IoC 容器)中查找一组已知子类型,并手动设置构造函数。这不是很棘手,但它足够棘手以至于不值得,除非您
真的需要它 .
public abstract class SomeBase { } // no [XmlInclude]
public class SomeConcrete : SomeBase { }
...
SomeBase obj = new SomeConcrete();
Type[] extras = {typeof(SomeConcrete)}; // from config
XmlSerializer ser = new XmlSerializer(typeof(SomeBase), extras);
ser.Serialize(Console.Out, obj);
XmlSerializer
如果您使用自定义 ctor 路由,重要的是缓存和重用
XmlSerializer
实例;否则每次使用都会加载一个新的动态程序集 - 非常昂贵(它们无法卸载)。如果您使用简单的构造函数,它会缓存并重用模型,因此只使用单个模型。
[XmlInclude]
不需要复杂的构造函数,也不需要担心缓存序列化程序。不过,另一个选项是存在的并且完全受支持。
SomeConcrete
,也许是由于 IoC/DI 或类似的框架;所以你可能有:
SomeBase obj = MyFactory.Create(typeof(SomeBase), someArgsMaybe);
SomeBase
具体实现,实例化它并将其交还。显然,如果我们的代码不知 Prop 体类型(因为它们只在配置文件中指定),那么我们就不能使用
XmlInclude
;但是我们可以解析配置数据并使用 ctor 方法(如上所述)。实际上,大多数时候
XmlSerializer
与 POCO/DTO 实体一起使用,因此这是一个人为的关注点。
XmlSerializer
不支持这种模式。坦率地说,强硬;那不是它的工作。它的工作是允许您存储和传输数据。不是执行。任何 xml-schema 生成的实体都不会
有 方法。数据是具体的,而不是抽象的。只要你认为“DTO”,接口(interface)争论就不是问题。因无法在其边界上使用接口(interface)而烦恼的人还没有接受关注点分离,即他们正试图这样做:
Client runtime entities <---transport---> Server runtime entities
Client runtime entities <---> Client DTO <--- transport--->
Server DTO <---> Server runtime entities
class Person {
public string AddressLine1 {get;set;}
public string AddressLine2 {get;set;}
}
<person>
<address line1="..." line2="..."/>
</person>
// (in a different namespace for the DTO stuff)
[XmlType("person"), XmlRoot("person")]
public class Person {
[XmlElement("address")]
public Address Address {get;set;}
}
public class Address {
[XmlAttribute("line1")] public string Line1 {get;set;}
[XmlAttribute("line2")] public string Line2 {get;set;}
}
关于.net - 抽象类的序列化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1327064/
我对 java 中的抽象有点困惑。 我查了很多页面说抽象就是数据隐藏(隐藏实现)。 我对抽象的理解是它是“部分实现”。只需在抽象类/接口(interface)中定义您需要的内容,然后扩展/实现它们并添
我是 Ruby 的新手,主要来自 C# 和 ActionScript 3(以及其他语言)。我对抽象功能很好奇。具体来说,包装和抽象 Ruby 的 FTP 和 SFTP 库。 我四处搜索,发现了一个名为
目录 Java基础知识(抽象) 抽象 抽象定义 abstract的使用 定义抽象类
这个月我花了一些时间与 Emacs Lisp 进行斗争,试图获得更好地满足我需求的自动缩进。令人惊讶的是,大多数缩进代码是多么低级。我只看到了很少的抽象,例如 搜索不在字符串或注释中的第一个正则表达式
我有以下内容: public abstract class Foo{ //contents of Foo // ... public class Bar extends
我有三个类(class)(A 类、B 类和 C 类)。 类 A 调用 B 的实例并运行 start()。 B类扩展了Thread,因此当调用start()时,run()方法中的任何内容都会被执行。 在
这个问题已经有答案了: Calling a subclass method from superclass (5 个回答) 已关闭 7 年前。 Klasse1是一个抽象类,有一个 foo()方法。 K
我有一个这样的函数: def test(): x = "3" # In actual code, this is computed if x is None: retu
我有两个基类之间的关系: public abstract class RecruiterBase { // Properties declare here // Constructors de
这是我第一次发帖,但我遇到了很多问题。我目前有一个带有标题的 AbstractDevice 类: public abstract class AbstractDevice> implements De
我有一个 MotorDefinition 类和一个名为 Motor 的抽象类: class MotorDefinition { public: MotorDefinition(int p1,
是否有任何方法可以在这种代码(sass)中制定 css 的抽象规则: #cottage-image-gallery input:nth-of-type(1):checked ~ label:nth-o
是否可以声明一个已知的基类型并允许传输所有派生类型? [ServiceContract] public interface IService { [OperationContract]
我目前正在为基于 Java 的文本游戏开发角色生成机制,但我遇到了一个问题,看不出哪里出了问题。我有一个“Character”类,它是抽象的,然后是另一个类“NPCharacter”,它是建立在这个之
抱歉,标题令人困惑。不太确定如何表达它,这可能是问题所在! 我正在寻找一个好的抽象来用于涉及并发线程的情况。 我已经接近了,但还不是很清楚。 稍微简化一下,我在 Android 手机上收集了两种传感器
提前感谢您阅读本文。我不完全理解如何/何时使用摘要,所以我试图在我从事的每个项目中考虑它,看看它是否会在某一天全部点击 Smile | :) 此外,可访问性级别(私有(private)、 protec
我正在探索用于生成 Web 内容的 XML -> XSLT -> HTML 模因。我的 XSLT 经验很少。 我很好奇 XSLT 中有哪些机制可用于处理抽象或“重构”。 例如,使用通用 HTML 和服
在这些谈话中 Nicholas Zakas和 Addy Osmani他们讨论了在构建大型 Javascript 应用程序时将外观模式用作沙箱的想法,以便将应用程序与底层基础库分离。 这种解耦理论上允许
我使用C++和CUDA/C,想为特定问题编写代码,但遇到了一个非常棘手的简化问题。 我在并行编程方面的经验不容忽视,但相当有限,我无法完全预见到此问题的特殊性。 我怀疑是否有一种方便甚至“轻松”的方式
假设我有: trait A class B extends A class C extends A 有没有办法配置类型参数: class Foo[AType <: A with canCreateIn
我是一名优秀的程序员,十分优秀!