动态对象和WCF支持

9

我想知道有没有人成功地将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=类型“ElasticTest1.MyDynamicObject”不能继承未标记有DataContractAttribute或SerializableAttribute的类型。请考虑为基础类型“System.Dynamic.DynamicObject”标记DataContractAttribute或SerializableAttribute,或从派生类型中删除它们。

你有什么建议吗?

错误信息告诉你,除非更改System.Dynamic.DynamicObject,否则无法执行此操作,但你无法更改它,因为它是.NET Framework的一部分。所以你不能这样做。你想要实现什么目标,也许有不同的方法可以达到相同的目的? - dtb
当然,虽然您无法更改DynamicObject,但它是开源的(http://dlr.codeplex.com/),因此您可以复制并修改它。 - Dino Viehland
我正在尝试将一个DynamicObject发送到SL 4客户端。 - rboarman
(不,它不会喜欢那样) - Marc Gravell
我很好奇你为什么选择使用动态对象来序列化到SL客户端。你的对象代表什么:来自数据库的数据,还是完全不同的东西?什么使你的数据具有动态性? - user452976
该系统用于实体驱动的游戏引擎。更多信息请参见:http://forums.tigsource.com/index.php?topic=10112.0 - rboarman
2个回答

10

3

你能使用类似于Dictionary<TKey, TValue>的东西来实现这个吗?

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

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


我放弃了DynamicObjects并使用AutoMapper扁平化DTOs。对于我的需求来说,它表现得相当不错。 - rboarman

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接