【问题标题】:XML-Serialization and the need public propertiesXML-Serialization 和需要公共属性
【发布时间】:2011-05-12 14:44:51
【问题描述】:

在我的 Silverlight 4 应用程序中,我通过 DataContractSerializer XML-Serialization 保存我的对象 - 这很简单:

public byte[] SerializeModel(ServiceModel model)
{
    System.Runtime.Serialization.DataContractSerializer serializer = new System.Runtime.Serialization.DataContractSerializer(typeof(ServiceModel));
    System.IO.MemoryStream ms = new System.IO.MemoryStream();

    serializer.WriteObject(ms, model);

    byte[] bytes = ms.ToArray();
    ms.Close();

    return bytes;
}

...并通过以下方式轻松加载它们:

public ServiceModel DeserializeModel(string stream)
{
    System.Runtime.Serialization.DataContractSerializer serializer = new System.Runtime.Serialization.DataContractSerializer(typeof(ServiceModel));
    System.Xml.XmlReader reader = System.Xml.XmlReader.Create(new System.IO.StringReader(stream));

    object result = serializer.ReadObject(reader);

    return (ServiceModel)result;
}

(省略错误处理)

对我来说问题是,我需要使用 getter 和 setter 来保存(或更好:加载)公共属性的数据。这会导致失去对数据完整性的控制。 IE。我有一组对象,我想控制要添加或删除哪些对象。我需要对集​​合进行子类化或重新实现,更改 Add 和 Remove 方法以及我需要控制的任何其他方法。但是将其设为私有使我无法使用 DataContractSerializer。

任何建议如何保持简单但保持对类中对象的控制?

提前致谢,
弗兰克

【问题讨论】:

  • 你不能在setter中控制这个吗?

标签: c# serialization architecture xml-serialization


【解决方案1】:

通常我在这些情况下所做的是将我的序列化对象保留为 POCO(只是获取/设置),然后一旦我反序列化它们,我将执行我需要进行的任何额外检查并酌情处理抛出/错误。

所以这意味着我有我的序列化“接口”,它只是 POCO,然后一旦我反序列化它,我就会进行任何一致性检查并加载/适应我的实体。在我工作的地方,我们使用我们的 Web 服务来做这件事,我们有我们的域实体和我们的接口类。一旦我们收到请求,我们会将其调整为我们的业务实体,然后将其传递到业务层并反转流程以获得结果。

我将序列化视为跨层,因此所有输入都应经过验证,然后进行调整以将耦合保持在最低限度。

但这只是我的 0.02 美元

【讨论】:

    猜你喜欢
    • 2011-11-30
    • 1970-01-01
    • 2018-02-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-17
    • 1970-01-01
    相关资源
    最近更新 更多