【问题标题】:How can I implement partial serialization?如何实现部分序列化?
【发布时间】:2011-03-03 13:46:48
【问题描述】:

我最近做了很多序列化开发,主要是为了通过套接字发送对象,但我遇到了一个有趣的问题:是否可以通过序列化器?

我设想的场景是这样的:每个客户端都有某种“状态”对象,由许多属性(字符串、整数、布尔值等)组成。当您的客户端首次连接时,整个状态对象通过 Xml 或二进制序列化程序进行序列化,并通过套接字发送,以便在另一端重新创建。现在客户端和服务器都有相同的状态对象。然后,您的服务器需要更改状态,只需设置状态对象的属性之一即可。套接字(挂钩到状态的事件,或状态对象本身的一部分)可以通过重新序列化整个对象来同步两种状态,但看起来单个“属性更改”对象就可以了。

显然,这可以手动实现。但似乎序列化程序应该能够只序列化一个属性,并像在另一边的补丁一样应用它。有谁知道这是否可能,还是我必须从头开始写整个东西?

【问题讨论】:

  • 序列化器只知道如何序列化和反序列化,即它们被转储到对象本身。他们不知道如何映射属性等,即使您可以进行部分序列化(使用忽略属性或诸如此类),您仍然需要代理来进行映射。序列化对象然后调用方法来同步各个字段不是更容易吗?我是否正确理解了您的问题?

标签: c# .net serialization xml-serialization


【解决方案1】:

使用XmlSerializer(和protobuf-net,对于二进制等效项,因为protobuf-net 采用XmlSerializer 的大部分模式),您可以通过以下方法做到这一点:

public bool SouldSerializeFoo() {
    return fooIsDirty;
}
public string Foo {get;set;}

对于每个属性Foo - 但您需要在自己的代码中手动维护“脏东西”(可能在set 中)。很多工作;我过去做过一个不同的序列化程序——老实说,它是一个真正的 PITA。我还应该注意[XmlIgnore] public bool FooSpecified {get{...} set{...}} 模式做同样的事情,但对于你想要的,ShouldSerialize* 更合适。

【讨论】:

  • XML 序列化程序是否会为每个项目自动查找ShouldSerialize____
  • 我不知道这对XmlSerializer 有效——我以为它只被表单设计者使用。我认为这没有任何明显的记录?
  • @cyclotis04 - 是的;和*指定的属性。
  • @Marc:*指定属性是什么意思?
  • 一个名为BlahSpecified 的公共bool 属性(带有公共get 和set),它告诉XmlSerializer 是否甚至查看 字段/属性Blah。它通常也标记为[XmlIgnore]XmlSerializer 有一些技巧;p 这只是它寻找的模式之一。
【解决方案2】:

作为对 Marc 答案的补充,here's the MSDN docs on the ShouldSerialize* methods

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-17
    • 2010-12-21
    • 1970-01-01
    • 2020-10-25
    • 1970-01-01
    相关资源
    最近更新 更多