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

本文关键字:错误 命名空间 序列化 XML | 更新日期: 2023-09-27 18:34:41

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

 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(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。如何应用正确的命名空间,以便序列化和反序列化都有效?

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

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

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

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

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

我试图减少这个问题。我将所有代码放在一个控制台应用程序中,删除了 async 和 await 关键字,删除了 NetworkMessage 继承并使用了 public static async Task<string> SerializeObject<T>(T obj) 。在调试和发布模式下没有问题。因此,请查看NetworkMessage实现(未指定,不是我知道的.Net类(,并确保在客户端和服务器上使用相同的dll(与SignatureMessage和其他类(。