gpt4 book ai didi

c# - XML(反)序列化错误命名空间

转载 作者:太空宇宙 更新时间:2023-11-03 12:51:25 28 4
gpt4 key购买 nike

我有一个通用的序列化器和反序列化器,用于通过网络连接发送的消息:

 public static async Task<string> SerializeObject<T>(Object obj)
{
string objectStr;
using (var memStream = new MemoryStream())
{
DataContractSerializer serializer = new DataContractSerializer(typeof(T));
serializer.WriteObject(memStream, (T)obj);

memStream.Position = 0;

using (var sr = new StreamReader(memStream))
{
objectStr = await sr.ReadToEndAsync();
}
}
return objectStr;
}

public static async Task<T> DeserializeObject<T>(string obj)
{
using (var memStream = new MemoryStream())
{
byte[] data = System.Text.Encoding.UTF8.GetBytes(obj);
memStream.Write(data, 0, data.Length);
memStream.Position = 0;
DataContractSerializer serializer = new DataContractSerializer(typeof(T));
T result = (T)(serializer.ReadObject(memStream));

return result;
}
}

我有一个简单的类,我对其进行序列化和反序列化。这是许多这样的类之一,这就是我拥有通用(反)序列化器的原因:

[DataContract]
public class SignatureMessage : NetworkMessage
{
[DataMember]
public string AppName { get; set; }
[DataMember]
public string AppUserName { get; set; }
[DataMember]
public string AppUserID { get; set; }
[DataMember]
public string IPAdress { get; set; }
[DataMember]
public string Port { get; set; }
}

当我将我的项目设置为“发布”而不是“调试”时。我得到一个 XMLException EncounteredWithNameNamespaceExpectingElement。在线研究后,建议将我的类更改为在 datacontract 元素中有一个空的命名空间,如下所示:

[DataContract(Namespace = "")]
public class SignatureMessage : NetworkMessage
{
[DataMember]
public string AppName { get; set; }
[DataMember]
public string AppUserName { get; set; }
[DataMember]
public string AppUserID { get; set; }
[DataMember]
public string IPAdress { get; set; }
[DataMember]
public string Port { get; set; }
}

当我尝试这个时,我得到了一个不同的 XMLException XmlPrefixBoundToNamespace。我怎样才能应用正确的命名空间,以便序列化和反序列化都能正常工作?

最佳答案

起初有两件事引起了我的注意:

  1. 您将 Object 传递给您的 SerializeObject 方法,而不是实际类型 T
  2. 空命名空间。 MSDN article 中给出了这个空命名空间提示对于视觉基础。但我仍然会忽略此提示并将 namespace 设置为独特且有意义的内容。请记住:命名空间在客户端和同一类型的服务上必须相同。

如果这两件事对您的事业没有帮助,您可能会遇到已知类型问题。因此,我还建议阅读 this article并利用其中使用的 GenericResolver

编辑:虽然我的提示可能无法帮助您解决问题,但它们仍然是正确的。但我注意到您发布的完整异常中有一些内容。 http://schemas.datacontract.org/2004/07/如果未明确指定,则为 DataContract 的默认命名空间。这可能意味着您正在尝试从 Listen.Extensions 发送内容。所以这也可能是寻找可能错误的一个很好的起点。

关于c# - XML(反)序列化错误命名空间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35392604/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com