“System.Messaging”系统如何识别它发送和接收的对象类型?

问题描述

编辑:问题的根本原因

我正在开发一个应用程序,它通过 System.Messaging 使用 XmlMessageFormatter 和 XML 序列化。

我想发送一个对象,比如 Class1,有一个 ID 字段:

public class Class1{
  public long Id1;
}

我还想发送另一个对象,比如 Class16,有另一个 ID 字段:

public class Class16{
  public long Id16;
}

在 XML 中,两者都需要如下所示:

<HM>Human_Message
  <ID>Own_Identifier</ID>
</HM>

为了实现这一点,我正在使用以下类似 [Xml] 的配置:

Class1:

[XmlRoot(ElementName = "HM")]
public class Class1{
  [XmlElement(ElementName = "ID")]
  public long Id1;
}

Class16:

[XmlRoot(ElementName = "HM")]
public class Class16{
  [XmlElement(ElementName = "ID")]
  public long Id16;
}

如您所见,两个类的 XML 正文确实相同。

这甚至可能吗?

编辑:原始问题

我有一个基本类(简单类),从中继承了几个子类(大约 27 个)。

我使用标准 C# System.Messaging 系统来回发送对象。

非常简化:

发送方:

我有一个 MessageQueue,正在做:

subClass1 Obj1 = subClass1(...);
...
Basic_Class Obj_To_Be_Sent = Basic_Class(Obj1);
System.Messaging.Message message = new System.Messaging.Message(Obj_To_Be_Sent);
obj_MessageQueue.Send(message,...);

检查 Obj_To_Be_Sent 时,类型正确。

发送后,当我查看计算机管理服务和应用程序消息队列、...、属性,我看到了消息,但我无法验证类型是否仍然正确。

接收方:

我有一个 _xmlMessageFormatter,其中包含(其中包括):

System.Type[] messageTypes = new System.Type[27];
messageTypes[0] = typeof(SubClass1);
...
messageTypes[15] = typeof(SubClass16);
...
message = this._receiveQueue.Receive();
Basic_Class general = (Basic_Class)this._xmlMessageFormatter.Read(message);
Type objectType= general.GetType();

令我惊讶的是,objectType 是错误的(据信是 SubClass16)。

此应用程序以前运行良好,但现在似乎出现故障。我遇到的最大问题是我不知道如何检查发送消息和获取接收消息类型之间的步骤。

是否有人了解计算机管理服务和应用程序消息队列、...,我如何检查对象是否发送端打字可以吗?
有人了解_xmlFormatter.Read()GetType()吗? (已经在 Read() 之后,观察窗口提到 general 的类型是错误的)

提前致谢

更多调查后编辑

我删除了我自己的答案,因为问题没有完全解决。

与此同时,我发现 [XmlRoot] 条目导致了上述问题:我一直在为不同的类使用相同的 [XmlRoot] 条目。

有办法区分吗?

为了您的信息,我已经尝试了以下但没有奏效:

Class1:

[XmlRoot(ElementName = "HM",DataType = "subClass1",Namespace="Namespace")]
public class subClass1 : Basic_Class

Class2:

[XmlRoot(ElementName = "HM",DataType = "subClass16",Namespace="Namespace")]
public class subClass16 : Basic_Class

_xmlFormatter.TargetTypes 包含以下条目:

Name = "subClass1" FullName="Namespace.Class1"
Name = "subClass16" FullName="Namespace.Class16"

有人有什么想法吗?

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)