【问题标题】:DynamicObject and WCF supportDynamicObject 和 WCF 支持
【发布时间】:2012-10-03 22:10:20
【问题描述】:

我想知道是否有人幸运地让 DynamicObject 序列化并使用 WCF?

这是我的小测试:

[DataContract]
class MyDynamicObject : DynamicObject
{
    [DataMember]
    private Dictionary<string, object> _attributes =
       new Dictionary<string, object>();

    public override bool TryGetMember(GetMemberBinder binder, out object result)
    {
        string key = binder.Name;

        result = null;

        if (_attributes.ContainsKey(key))
            result = _attributes[key];

        return true;
    }

    public override bool TrySetMember(SetMemberBinder binder, object value)
    {
        _attributes.Add(binder.Name, value);

        return true;
    }
}

var dy = new MyDynamicObject();
var ser = new DataContractSerializer(typeof(MyDynamicObject));
var mem = new MemoryStream();
ser.WriteObject(mem, dy);

我得到的错误是:

System.Runtime.Serialization.InvalidDataContractException 未处理 Message=Type 'ElasticTest1.MyDynamicObject' 不能从未用 DataContractAttribute 或 SerializableAttribute 标记的类型继承。考虑使用 DataContractAttribute 或 SerializableAttribute 标记基类型“System.Dynamic.DynamicObject”,或从派生类型中删除它们。

有什么建议吗?

【问题讨论】:

  • 错误消息告诉您,除非您更改 System.Dynamic.DynamicObject,否则您不能这样做,因为它是 .NET Framework 的一部分。所以你不能这样做。你想达到什么目标,也许有不同的方法可以实现相同的目标?
  • 当然,虽然您不能更改 DynamicObject,但它是开源的 (dlr.codeplex.com),因此您可以复制和修改它。
  • 我正在尝试将 DynamicObject 通过线路发送到 SL 4 客户端。
  • (不,不会这样)
  • 我很好奇您为什么选择使用动态对象序列化到 SL 客户端。你的对象代表什么:来自数据库的数据,还是完全不同的东西?是什么让您的数据动态化?

标签: c# c#-4.0 dynamic-language-runtime


【解决方案1】:

Solution for your problem

实现自定义IDynamicMetaObjectProvider

【讨论】:

    【解决方案2】:

    你可以使用Dictionary&lt;TKey, TValue&gt; 之类的东西来实现这一点吗?

    我正在尝试解决类似的问题。我的问题是我有 DTO 在客户端和服务器之间传输数据。但是,您应该始终拥有细粒度和扁平化的 DTO。

    例如,如果客户想要获取客户的姓名和 ID,并且对其他任何内容都不感兴趣,理想情况下,您应该创建一个仅包含这两个属性的 DTO。如果您要为所有方法传输相同的 CustomerDTO,则会对性能产生很多影响。您可能会传输大量冗余字段。

    【讨论】:

    • 我放弃了 DynamicObjects 并选择了使用 AutoMapper 扁平化的 DTO。它可以很好地满足我的需要。
    猜你喜欢
    • 2015-09-15
    • 1970-01-01
    • 2011-04-11
    • 2011-10-06
    • 2019-12-16
    • 1970-01-01
    • 1970-01-01
    • 2023-03-25
    • 1970-01-01
    相关资源
    最近更新 更多