如何构建类来实现 IEquatable 和 ISerialized
我已经为此烦恼了一段时间了
我遇到的问题是尝试添加 IEquatable 行为,以便我的派生类可以使用集合操作 ILink 的交集等。
目前我有......
public interface ILink
{
int Linkid { get; set; }
bool IsActive { get; set; }
}
和一堆像
public class Domain : ILink
{
public Domain(){}
}
public class User : ILink
{
public User (){}
}
这样的 派生类为了做列表的交集 我以为我会像这样创建一个抽象类...
public abstract class AbstractLink : IEquatable<ILink>, ISerializable, ILink
{
public AbstractLink(){}
public AbstractLink(SerializationInfo info, StreamingContext ctxt)
{}
public virtual void GetObjectData(SerializationInfo info, StreamingContext ctxt)
{}
}
但是,当我将派生类型从 更改
public class DomainLink : ILink
{
}
为 时,
public class DomainLink : AbstractLink
{
}
我得到一个 SerializationException“未找到成员'Linkid'”。这是它尝试反序列化的第一个成员
顺便说一句:这是远程处理,因此需要自定义序列化 - 有没有办法将这些行为组合在一起?
非常感谢!
中号
Been banging my head on this for a while now
The problem I have is trying to add the IEquatable behaviour so my derived classes can use set operations Intersect of ILink etc.
At the moment I have...
public interface ILink
{
int Linkid { get; set; }
bool IsActive { get; set; }
}
and a bunch of derived classes like
public class Domain : ILink
{
public Domain(){}
}
public class User : ILink
{
public User (){}
}
so in order to do Intersection of List
I thought I'd create an abstract class like so...
public abstract class AbstractLink : IEquatable<ILink>, ISerializable, ILink
{
public AbstractLink(){}
public AbstractLink(SerializationInfo info, StreamingContext ctxt)
{}
public virtual void GetObjectData(SerializationInfo info, StreamingContext ctxt)
{}
}
however when I change my derived types from
public class DomainLink : ILink
{
}
to
public class DomainLink : AbstractLink
{
}
I get a SerializationException "Member 'Linkid' was not found." which is the 1st member it attempts to deserialize
BTW: this is Remoting hence the need for the custom Serialization - is there a way to compose these behaviours together?
Many thanks!
M
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
您的示例代码无法编译。您没有实现 ILink 接口成员。
下面的代码确实有效。
每个重写 AbstractLink 的对象都需要一个序列化构造函数。 AbstractLink 的每个子类也需要用 [Serializable] 进行注释。如果向域对象添加额外的属性,您还需要为额外的属性实现 GetObjectData()。
Your example code does not compile. You do not implement the ILink interface members.
The following code does work.
Each object that overrides AbstractLink requires a serialization constructor. Each subclass for AbstractLink also needs to be annotated with [Serializable]. If you add extra properties to the domain objects you will also need to implement GetObjectData() for the extra properties.