首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >XML (反)序列化错误命名空间

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

Stack Overflow用户
提问于 2016-02-14 21:57:14
回答 2查看 129关注 0票数 2

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

代码语言:javascript
复制
 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;
        }
    }

我有一个简单的类,可以序列化和反序列化。这是许多这样的类中的一个,这就是为什么我有泛型(反)序列化程序:

代码语言:javascript
复制
[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; }
}

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

代码语言:javascript
复制
[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。如何应用适当的命名空间,以便序列化和反序列化都能正常工作?

EN

回答 2

Stack Overflow用户

发布于 2016-02-14 23:41:57

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

T.

  • The
  1. Object传递给SerializeObject方法,而不是实际的类型为空命名空间。此空命名空间提示在visual basic的MSDN article中提供。但我仍然会忽略这个技巧,并将名称空间设置为唯一且有意义的名称空间。只需记住:对于相同类型的客户端和服务,名称空间必须相同。

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

编辑:虽然我的建议可能不能帮助你解决问题,但它们仍然是正确的。但我注意到你发布的完整异常中有一些东西。如果没有显式指定任何名称空间,则http://schemas.datacontract.org/2004/07/DataContract的默认名称空间。这可能意味着您正在尝试从Listen.Extensions发送某些内容。因此,这也可能是查找可能的错误的一个很好的起点。

票数 1
EN

Stack Overflow用户

发布于 2016-02-16 05:37:53

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35392604

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档