首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >条件C#二进制序列化

条件C#二进制序列化
EN

Stack Overflow用户
提问于 2010-09-06 11:31:35
回答 3查看 1.5K关注 0票数 1

我使用BinaryFormatter按条件序列化一个类及其变量。例如:

代码语言:javascript
复制
[Serializable]
public class Class1
{
private Class2 B;
...
}

[Serializable]
public class Class2{...}

我希望变量B仅在远程处理时序列化,而不是在将其序列化到文件存储时序列化。问题:

1)我知道在XmlSerialization中,我们可以使用指定的XmlIgnore和{PropertyName}来有条件地忽略该属性。这是NonSerialized的等效方法吗?

2)对于有Serializable属性的类,运行时如何忽略?

EN

回答 3

Stack Overflow用户

发布于 2010-09-06 11:46:50

  1. 没有这样的方法。您可以通过实现ISerializable来控制序列化,如果您这样做了,您将知道哪个序列化上下文是活动的(远程处理、文件等)。
  2. AFAIK无法做到这一点,为什么要这样做?

一般来说,我建议你不要使用BinaryFormatter。这是一个令人头疼的维护问题。使用XML序列化或某种协议缓冲区。

票数 0
EN

Stack Overflow用户

发布于 2010-09-06 20:37:08

  1. 如前所述,它并不存在。您可以通过编写代码来摆脱它,尽管它有点混乱(如果您不想像前面所建议的那样实现ISerializable接口)。

可序列化的公共类ClassA { OnSerializing私有空OnSerializing(StreamingContext context) {//根据上下文或一些内部布尔BSerialized =B设置BSerialized = B;} OnSerialized私有空OnSerialized(StreamingContext context) {//清除BSerialized BSerialized = null;} OnDeserialized私有空OnDeserialized(StreamingContext context) {//从BSerialized B= BSerialized恢复B;BSerialized= null;} NonSerialized私有类B;私有ClassB BSerialized;}可序列化的公共类ClassB {}

  • 你不能忽略它。您只能在运行时更改特性的属性,并且由于NonSerialized特性不接受true / false参数,因此您无法在运行时对其执行任何操作。
票数 0
EN

Stack Overflow用户

发布于 2013-03-08 12:48:07

我写了一个相当简单但可扩展的框架来使用绑定来解决这类问题。我不确定我是否完全理解,但这是可能的:

代码语言:javascript
复制
public class Class1
{
  [Ignore]
  public bool IsRemoting { get; set; }

  [SerializeWhen("IsRemoting", true)]
  public Class2 B;
}

http://binaryserializer.codeplex.com

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3648858

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档