WCF中使用MSMQ无法传送自定义对象
2009-12-27 22:16
363 查看
WCF在底层使用操作系统的MSMQ实现离线的队列操作,并为此提供了一个NetMsmqBinding。
通过精心的设计,在WCF中使用NetMsmqBinding与使用其他绑定的编程方式是一致的。
然而,这里面有一个容易忽视的地方。那就是要注意在服务协定中要使用自定义对象的问题。
一个例子如下所示:
[ServiceContract]
public interface IWCFMSMQTransactionService
{
[OperationContract(IsOneWay=true)]
void SendMessage(MyDataItem data);
}
上述服务协定要使用自定义类型MyDataItem ,它的声明如下 :
[DataContract]
public class MyDataItem
{
[DataMember]
public int IntValue
{
get;
set;
}
[DataMember]
public string StringValue
{
get;
set;
}
}
你会发现,如果使用NetMsmqBinding绑定时,客户端将无法将一个MyDataItem对象序列化并传送到服务端。并且,整个程序不会引发任何异常,只是服务端反序列化出来的MyDataItem对象的属性全部具有默认值。
解决方法很简单:
给MyDataItem加上一个命名空间:
[DataContract(Namespace="http://www.bit.edu.cn/CS")]
public class MyDataItem
{
[DataMember]
public int IntValue
{
get;
set;
}
//代码略
}
则一切工作正常。
原因何在?
其实,这是因为MSMQ的问题。默认设置下,MSMQ使用XmlMessageFormatter序列化对象,对象被转换为XML数据。在这个序列化过程中,如果WCF中的数据对象没有设置命名空间,则MSMQ不会序列化这个对象中各个属性的值,这是可以理解的,XML规范要求必须通过命名空间区分开不同来源的XML数据中可能同名的元素。
通过精心的设计,在WCF中使用NetMsmqBinding与使用其他绑定的编程方式是一致的。
然而,这里面有一个容易忽视的地方。那就是要注意在服务协定中要使用自定义对象的问题。
一个例子如下所示:
[ServiceContract]
public interface IWCFMSMQTransactionService
{
[OperationContract(IsOneWay=true)]
void SendMessage(MyDataItem data);
}
上述服务协定要使用自定义类型MyDataItem ,它的声明如下 :
[DataContract]
public class MyDataItem
{
[DataMember]
public int IntValue
{
get;
set;
}
[DataMember]
public string StringValue
{
get;
set;
}
}
你会发现,如果使用NetMsmqBinding绑定时,客户端将无法将一个MyDataItem对象序列化并传送到服务端。并且,整个程序不会引发任何异常,只是服务端反序列化出来的MyDataItem对象的属性全部具有默认值。
解决方法很简单:
给MyDataItem加上一个命名空间:
[DataContract(Namespace="http://www.bit.edu.cn/CS")]
public class MyDataItem
{
[DataMember]
public int IntValue
{
get;
set;
}
//代码略
}
则一切工作正常。
原因何在?
其实,这是因为MSMQ的问题。默认设置下,MSMQ使用XmlMessageFormatter序列化对象,对象被转换为XML数据。在这个序列化过程中,如果WCF中的数据对象没有设置命名空间,则MSMQ不会序列化这个对象中各个属性的值,这是可以理解的,XML规范要求必须通过命名空间区分开不同来源的XML数据中可能同名的元素。
相关文章推荐
- WCF中使用MSMQ无法传送自定义对象
- WCF中使用MSMQ无法传送自定义对象
- spring+memcached+mybatis整合,memcached使用main函数可以保存自定义对象,使用spring管理memcached配置后无法保存
- Java访问DotNet平台WCF服务,使用自定义对象如IDictionary做参数时,抛出"Did not understand MustUnderstand"异常
- 关于:“无法序列化会话状态。在“StateServer”或“SQLServer”模式下,ASP.NET 将序列化会话状态对象,因此不允许使用无法序列化的对象或 MarshalByRef 对象。如果自定义会话状态存储在“Custom”模式下执行了类似的序列化,则适用同样的限制。”的问题
- 无法序列化会话状态。在“StateServer”或“SQLServer”模式下,ASP.NET 将序列化会话状态对象,因此不允许使用无法序列化的对象或 MarshalByRef 对象。如果自定义会话状态存储在“Custom”模式下执行了类似的序
- 关于:“无法序列化会话状态。在“StateServer”或“SQLServer”模式下,ASP.NET 将序列化会话状态对象,因此不允许使用无法序列化的对象或 MarshalByRef 对象。如果自定义会话状态存储在“Custom”模式下执行了类似的序列化
- 无法序列化会话状态。在“StateServer”或“SQLServer”模式下,ASP.NET 将序列化会话状态对象,因此不允许使用无法序列化的对象或 MarshalByRef 对象。如果自定义会话状态存储在“Custom”模式下执行了类似的序列化,则适用同样的限制。
- iOS 数据持久化 NSUserDefault 的使用 NSUserDefaults读取和写入自定义对象
- js闭包避免内存泄漏 减少内存使用 避免对象无法回收注意事项
- 使用HashSet 存储自定义对象,为什么需要重写hashCode()和equals()?
- .NET 插件系统框架设计(二) 使用对象序列化实现自定义配置文件管理
- ExpandListView使用自定义对象时异常
- 使用BlazeDS实现java与flex传对象时,RemoteClass中包含自己写的类,后台无法转换的问题
- WCF使用Net.tcp绑定时候出现错误:元数据包含无法解析的引用
- STL map使用自定义对象做key
- 使用Intent传递自定义对象
- 使用RabbitMQ放置自定义对象(不借助序列化工具,例如protobuffer)V2.0
- Android Studio使用AIDL时无法找到自定义的类
- 使用意图在Activity之间传递数据小插曲__传递自定义的序列化对象