“KeyValuePair”的序列化
有一个朋友提到:KeyValuePair默认不能被序列化,你须要自定义一个KeyValuePair并将其标志为[Serializable]” ,在这里再次谢谢他,谢谢。
问题一:应该怎样自定义呢??? “KeyValuePair”类型作为“服务接口方法的参数”会报错,但是作为实体类的属性没有问题。
实体对象属性如下:
public KeyValuePair<Period, string> Date
{
get; set;
}
服务接口方法:
public List<Monitoring> GetMonitoringEntityData(Monitoring.EnergyType energytype, KeyValuePair<Monitoring.Period, string> monitordate,KeyValuePair<Monitoring.MonitorType, string> monitortype, string meterusetype, bool issubstation)
问题二:
“NET简单类型,你可以使用Serializable属性,这些你就不须要显示定义DataContract了,其它的复杂类型(例如类中还包含有其它自定类型的属性时),这时我就要使用DataContract与DataMember来显示标记类与属性等”
“Serializable属性”怎么被使用的???什么也没做啊?
是不是
[SerializableAttribute]
[ComVisibleAttribute(true)]
publicsealedclass String : IComparable,
ICloneable, IConvertible, IComparable<string>, IEnumerable<char>,
IEnumerable, IEquatable<string>
[SerializableAttribute]
public struct KeyValuePair<TKey, TValue>
是不是“SerializableAttribute” 标记??? “KeyValuePair”和“String”类型都有啊。。。
------解决方案--------------------
------解决方案--------------------public KeyValuePair<Period, string> Date
{
get; set;
}
自动实现的属性不能序列化
------解决方案--------------------关键是你的Period是否支持序列化,如果是虚基类,那么肯定是不支持序列化了。
------解决方案--------------------如果我没搞错,这个帖子应该是同一个问题:http://topic.csdn.net/u/20120529/19/00d92ccd-f45f-46d4-a911-9034b667c0f6.html
你有没有看我最后给你的建议。ServiceKnownType
------解决方案--------------------这个应该是Silverlight的BUG了,如果你客户端使用WinForm,方法不变,就可以正常。
------解决方案--------------------
网上我找了下类似的问题,很多答案是,因为KeyValuePair的Key和Value属性都是只读的,因此无法序列化,这个虽然有点道理,但是理由却不充分,因为我单独调用DataContractSerializer类对齐序列化,非常正常,反序列化也是。而WCF就是用的这个类来处理序列化过程的,因此微软对这个类单独做了处理的,而且WinForm下使用WCF传输KeyValuePair也非常正常,没有任何错误,因此这个问题就是Silverlight对该类的特殊处理上面没有做好导致的。
为了解决这个麻烦的BUG,建议你直接使用Dictionary<string, string>来传输,Dictionary是支持序列化的,且工作正常,而访问其内部的KeyValuePair也方便,直接Linq表达式一下搞定,如果你传输的KeyValuePair和Dictionary是完全无关的类型,那么完全可以自定义一个其它类而不要使用系统自带的那个只有Get而没有Set的KeyValuePair类型。