我遇到了数据合约序列化程序的一个非常愚蠢的问题。它拒绝工作。我只是想把一个对象序列化为一个XmlDocument,但是我似乎遇到了麻烦。
以下是我希望序列化的数据契约:
[DataContract(Namespace="urn://test", Name = "ServiceFault1")]
public class ServiceFault
{
[DataMember()]
public int hello { get; set; }
[DataMember()]
public List<Error> Errors {get; set;}
}
[DataContract(Namespace = "urn://test", Name = "Error1")]
public class Error
{
[DataMember()]
public string ErrorCategoryCode { get; set; }
[DataMember()]
public string LocalErrorCode { get; set; }
[DataMember()]
public string Description { get; set; }
}以及进行序列化的方法;
public static XmlDocument Serialize(ServiceFault toSer)
{
DataContractSerializer ser = new DataContractSerializer(toSer.GetType());
MemoryStream mem = new MemoryStream();
ser.WriteObject(XmlWriter.Create(mem), toSer);
XmlDocument tmp = new XmlDocument();
mem.Seek(0, SeekOrigin.Begin);
tmp.Load(mem);
return tmp;
}每当我调用serialize方法时,内存流总是空的。我也尝试了一个字符串生成器,看看有没有什么东西出来。
如果我使用XmlSerializer就可以了,但是我想知道为什么上面的代码不能工作?为什么序列化程序总是空的?
谢谢你的帮助!TM
发布于 2010-10-05 03:27:54
这是我用来序列化我的对象的代码,它似乎对我很有效。另外,我认为DataContract属性是不必要的,我只是在一个地方使用了一个属性来忽略一个成员。
DataContractSerializer serializer = new DataContractSerializer(toSers.GetType());
MemoryStream ms = new MemoryStream();
serializer.WriteObject(ms, toSer);
ms.Position = 0;
string serializedContent;
using(StreamReader sr = new StreamReader(ms))
{
serializedContent = sr.ReadToEnd();
}我看到的不同之处在于,我直接写入MemoryStream,并将位置设置为0,而不是调用Seek()。
如果愿意,可以在实例上使用XmlDocument.LoadXml将结果字符串加载到XmlDocument中。
发布于 2010-10-05 04:31:37
问题存在于以下代码行中,因为XmlWriter尚未将其内容刷新到内存流中:
ser.WriteObject(XmlWriter.Create(mem), toSer);请尝试使用以下命令:
public static XmlDocument Serialize(ServiceFault toSer)
{
DataContractSerializer ser = new DataContractSerializer(toSer.GetType());
XmlDocument tmp = new XmlDocument();
using (MemoryStream mem = new MemoryStream())
{
using (var memWriter = XmlWriter.Create(mem))
{
ser.WriteObject(memWriter, toSer);
}
mem.Seek(0, SeekOrigin.Begin);
tmp.Load(mem);
}
return tmp;
}https://stackoverflow.com/questions/3858205
复制相似问题