C# 反序列化派生类型会导致“0”;“期望元素”;错误
我尝试使用微软的Serivce总线代理消息API,在尝试使用派生类型时遇到反序列化问题。代码似乎无法识别已知类型,在序列化这些类型并在其他服务之间返回它们时,我没有任何问题。有什么我遗漏的吗?我已经浏览了很多这样的帖子,但似乎没有任何效果 以下是消息结构:C# 反序列化派生类型会导致“0”;“期望元素”;错误,c#,servicebus,brokeredmessage,C#,Servicebus,Brokeredmessage,我尝试使用微软的Serivce总线代理消息API,在尝试使用派生类型时遇到反序列化问题。代码似乎无法识别已知类型,在序列化这些类型并在其他服务之间返回它们时,我没有任何问题。有什么我遗漏的吗?我已经浏览了很多这样的帖子,但似乎没有任何效果 以下是消息结构: [DataContract] [KnownType(typeof(ActivityBus))] public class BaseBusType { [DataMember] public int Id { get; set;
[DataContract]
[KnownType(typeof(ActivityBus))]
public class BaseBusType
{
[DataMember]
public int Id { get; set; }
}
[DataContract]
public class ActivityBus : BaseBusType { }
到目前为止,我已经尝试了以下选项:
// In the sending function
var brokeredMessage = new BrokeredMessage(reader.ReadToEnd());
topicClient.Send(obj);
// In the receiving function
List<Type> knownTypes = new List<Type>() { typeof(ActivityBus) };
var serializer = new DataContractSerializer(typeof(BaseBusType), knownTypes); // listed knowntypes for brevity
var messageBody = message.GetBody<BaseBusType>(serializer);
//在发送函数中
var brokeredMessage=新的brokeredMessage(reader.ReadToEnd());
topicClient.Send(obj);
//在接收功能中
List knownTypes=新列表(){typeof(ActivityBus)};
var serializer=新的DataContractSerializer(typeof(baseBustType),knownTypes);//为简洁起见,列出了knowntypes
var messageBody=message.GetBody(序列化程序);
此外:
//在发送函数中
使用(MemoryStream MemoryStream=new MemoryStream())
使用(StreamReader=新StreamReader(memoryStream))
{
DataContractSerializer serializer=新的DataContractSerializer(typeof(T));
serializer.WriteObject(memoryStream,data);
memoryStream.Position=0;
var brokeredMessage=新的brokeredMessage(reader.ReadToEnd());
topicClient.Send(代理消息);
}
//在接收功能中
使用(Stream=newmemoryStream())
{
var str=brokeredMessage.GetBody();
byte[]data=System.Text.Encoding.UTF8.GetBytes(str);
stream.Write(数据,0,数据长度);
流位置=0;
List knownTypes=新列表(){typeof(Activitybus)};
var反序列化器=新的DataContractSerializer(typeof(baseBustType),knownTypes);
var reader=XmlReader.Create(newstringreader(str));
var obj=反序列化器.ReadObject(读卡器);
返回(T)obj;
}
// In the sending function
using (MemoryStream memoryStream = new MemoryStream())
using (StreamReader reader = new StreamReader(memoryStream))
{
DataContractSerializer serializer = new DataContractSerializer(typeof(T));
serializer.WriteObject(memoryStream, data);
memoryStream.Position = 0;
var brokeredMessage = new BrokeredMessage(reader.ReadToEnd());
topicClient.Send(brokeredMessage);
}
// In the receiving function
using (Stream stream = new MemoryStream())
{
var str = brokeredMessage.GetBody<string>();
byte[] data = System.Text.Encoding.UTF8.GetBytes(str);
stream.Write(data, 0, data.Length);
stream.Position = 0;
List<Type> knownTypes = new List<Type>() { typeof(Activitybus) };
var deserializer = new DataContractSerializer(typeof(BaseBusType), knownTypes);
var reader = XmlReader.Create(new StringReader(str));
var obj = deserializer.ReadObject(reader);
return (T)obj;
}