我有一个通用的串行器和解串器,用于通过网络连接发送的消息:
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;
}
}
我有一个简单的类,我序列化和反序列化。这是像这样的许多类之一,这就是为什么我有泛型(de)序列化器:
[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元素中有一个空名称空间,如下所示:
[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。如何应用正确的命名空间,以便序列化和反序列化都有效?
答案 0 :(得分:1)
起初有两件事引起了我的注意:
Object
传递给SerializeObject
方法而非实际类型T
。如果这两件事对你的事业没有帮助,你可能会遇到KnownType-Issue。因此,我还建议您阅读this article并使用其中使用的GenericResolver
。
编辑:虽然我的提示可能无法帮助您解决问题但仍然如此。但是我注意到你发布的完整例外情况。 http://schemas.datacontract.org/2004/07/是DataContract
的默认命名空间,如果没有明确指定的话。这可能意味着您正在尝试从Listen.Extensions
发送内容。因此,这也可能是寻找可能错误的良好起点。
答案 1 :(得分:0)
我试图减少问题。我将所有代码放在一个控制台应用程序中,删除了异步和等待关键字,删除了NetworkMessage继承并使用了.find()
。调试和释放模式没有问题。所以看一下NetworkMessage实现(未指定,不是我知道的.Net类),并确保在客户端和服务器上使用相同的dll(使用SignatureMessage和其他类)。