如何读取xml,根据xml动态的创建实体类然后并调用创建实体类。这个可以实现吗?
我想做一个客户可以通过界面配置的MSMQ接口。用xml配置接口发送的消息格式和结构。因为我了解的msmq发送报文设置格式要用“myMessage.Formatter = new XmlMessageFormatter(new Type[] { typeof(T) }); ” ,T要是个实体类,我想根据xml配置自动去生成这个实体类
我的想法有点问题。我现在遇到的问题如下
使用MSMQ发送xml时有个设置
Message.Formatter属性的,按照正常要创建一个实体类,然后Message.Formatter = new XmlMessageFormatter(new Type[] { typeof(实体类) }),消息队列的正文才能显示正常的xml,那如何将数据存的字符串(例如:字符串为"<?xml version="1.0"><Head></Head><List><user></user></List>")发送出去,对方接受的也是相应的值,现在出现下列值。没有其他方法呢?
3C 3F 78 6D 6C 20 76 65 <?xml ve
72 73 69 6F 6E 3D 22 31 rsion="1
2E 30 22 3F 3E 0D 0A 3C .0"?>..<
73 74 72 69 6E 67 3E 26 string>&
6C 74 3B 3F 78 6D 6C 20 lt;?xml
76 65 72 73 69 6F 6E 3D version=
22 31 2E 30 22 20 65 6E "1.0" en
可能描述比较含糊。我写的程序大致流程是 1.用户配置MSMQ消息的接收发送地址和消息的结构(例如:“<?xml version="1.0"><Head></Head><List><user></user></List><List><user></user></List>“在用户界面配置的是Head第一层第一个不循环父节点是xml,List第一层第二个循环...)及各个节点关联数据库的数据等 2.根据配置和关联数据创建xml然后转化String保存到数据库 3.讲保存的消息发送出去。自己想的中间不创建任何的消息实体类,发送时根据结构配置自动实现,目的是让维护人员就可以做接口对接,减少开发。但是将消息格式化要用到System.Messaging.Message.Formatter,格式化一定要传个实体类,不用实体类用String就会出现
3C 3F 78 6D 6C 20 76 65 <?xml ve
72 73 69 6F 6E 3D 22 31 rsion="1
2E 30 22 3F 3E 0D 0A 3C .0"?>..<
73 74 72 69 6E 67 3E 26 string>&
6C 74 3B 3F 78 6D 6C 20 lt;?xml
76 65 72 73 69 6F 6E 3D version=
22 31 2E 30 22 20 65 6E "1.0" en
请问有没有其他方法解决这个问题?我发送的是什么服务器哪里接收的是什么
然后.创建完实体类要拿来干嘛?
是这样的,我想做一个客户可以通过界面配置的MSMQ接口。用xml配置接口发送的消息格式和结构。因为我了解的msmq发送报文设置格式要用“myMessage.Formatter = new XmlMessageFormatter(new Type[] { typeof(T) }); ” ,T要是个实体类,我想根据xml配置自动去生成这个实体类
还是不明白这么做的必要性.
运行时生成代码是可以的.但是如果不是那么必要.没人去花这功夫.
@拜托鸡肋的菜鸟: 意思是.你已经有了一个消息要发送的实体类.只是这个实体类有多个.
配置是在多个已有的实体类里切换?
@拜托鸡肋的菜鸟: 那你就把消息弄成string格式.然后传json字符串.
传入的获取的时候都json序列化和反序列化一下.
你发送时根据配置自动实现了.那接受的地方呢.接受的地方不知道消息内容的结构怎么用他?
@吴瑞祥: 接收比较好处理,接收都是状态值。我已经处理过了,不用任何的实体类,直接将xml或者json转化为DataSet就可以了,然后根据配置关联相应的表字段
@拜托鸡肋的菜鸟: 这个配置是在客户端做的.你服务器怎么能知道对应的映射关系?
@拜托鸡肋的菜鸟: 那你就发送json字符串吧.类型就是string.没这些事.
完全没必要去搞什么运行时代码.
@拜托鸡肋的菜鸟: 你用xml传json值啊..
@拜托鸡肋的菜鸟: 你要传的是个对象吧.你先把这个对象json序列化了.
得到一个字符串.然后用你这个MSMQ发出去.Message.Formatter = new XmlMessageFormatter(new Type[] { typeof(string) }),
这样
可以。你先序列化出来就清楚了。
序列化后如何调用?
@拜托鸡肋的菜鸟: 不管你走什么通道,只要是时序体系(目前的计算机都是),一定会有10,那么接收方把这个byte[]拿去反序列化就行了。如果无法做到类型自动匹配,你大不了再创建个类,包含{typeName;instanceData;},然后前者用于类型说明,后者为实例,最后整体ToBuffer