Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/299.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# XML(反)序列化命名空间错误_C#_Xml_Serialization - Fatal编程技术网

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

C# XML(反)序列化命名空间错误,c#,xml,serialization,C#,Xml,Serialization,对于通过网络连接发送的消息,我有一个通用序列化程序和反序列化程序: public static async Task<string> SerializeObject<T>(Object obj) { string objectStr; using (var memStream = new MemoryStream()) { DataContractSerializer serializer

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

 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;
        }
    }
当我将项目设置为“发布”而不是“调试”时。我在NamespaceExpectingElement中遇到一个XMLException。在线研究后,建议将我的类更改为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。如何应用适当的名称空间,以便序列化和反序列化都能工作?

起初,有两件事吸引了我的眼球:

  • 对象
    传递给
    序列化对象
    方法,而不是实际的类型
    T
  • 空名称空间。此空命名空间提示在for visual basic中给出。但我还是会忽略这个技巧,将名称空间设置为一些独特且有意义的内容。请记住:对于同一类型,客户机和服务上的名称空间必须相同
  • 如果这两件事对你的事业没有帮助,你可能会遇到知识型问题。因此,我还建议您阅读并使用其中使用的
    genericlesolver


    编辑:虽然我的建议可能对你的问题没有帮助,但它们仍然是正确的。但我注意到你发布的完全例外的东西。如果未明确指定任何名称空间,则为
    DataContract
    的默认名称空间。这可能意味着您正试图从
    Listen.Extensions
    发送内容。因此,这也可能是寻找可能错误的良好起点

    我试图减少这个问题。我将所有代码放在一个控制台应用程序中,删除了async和wait关键字,删除了NetworkMessage继承,并使用了
    公共静态异步任务序列化对象(tobj)
    。在调试和发布模式下没有问题。因此,请查看NetworkMessage实现(未指定,不是我知道的.Net类),并确保使用相同的dll(与SignatureMessage和其他类一起使用)在客户端和服务器上。

    您可以发布XMLPrefixBoundtonNameSpace的完整xml异常吗?引发的异常:“System.Private.DataContractSerialization.dll中的System.ArgumentException”其他信息:XMLPrefixBoundtonNameSpace,
    [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; }
    }