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
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; }
}