C# 使用“反序列化字符串列表”\";结果为空字符串
我已经在这上面撞了一段时间了。看起来这一定是一个简单的解决方案,但我已经在互联网上搜索并尝试了很多东西 我有一个复杂的对象,它包含一个字符串列表,需要序列化为xml,然后反序列化 序列化代码早已成为应用程序的一部分,并在无数其他场景中工作,但这里的问题似乎是字符串列表中的一个元素仅仅是一个新行字符(即“\n”) 我的理解是,根据我的研究,它按预期进行序列化(见下文),但反序列化后,元素包含一个空字符串(即“”),而不是“\n” 这是代码C# 使用“反序列化字符串列表”\";结果为空字符串,c#,xml,xml-serialization,newline,xmlserializer,C#,Xml,Xml Serialization,Newline,Xmlserializer,我已经在这上面撞了一段时间了。看起来这一定是一个简单的解决方案,但我已经在互联网上搜索并尝试了很多东西 我有一个复杂的对象,它包含一个字符串列表,需要序列化为xml,然后反序列化 序列化代码早已成为应用程序的一部分,并在无数其他场景中工作,但这里的问题似乎是字符串列表中的一个元素仅仅是一个新行字符(即“\n”) 我的理解是,根据我的研究,它按预期进行序列化(见下文),但反序列化后,元素包含一个空字符串(即“”),而不是“\n” 这是代码 public DoStuff(ItemTypeObj it
public DoStuff(ItemTypeObj item)
{
string myItem = XmlSerialize<ItemType>(item);
ItemTypeObj myNewItemTypeObj = XmlDeserialize<CustomItem>(myItem)
}
public static string XmlSerialize<T>(T objectToSerialize)
{
string ret = string.Empty;
XmlSerializer s = new XmlSerializer(typeof(T));
using (MemoryStream ms = new MemoryStream())
{
s.Serialize(ms, objectToSerialize);
ms.Position = 0;
using (StreamReader sr = new StreamReader(ms))
{
sRet = sr.ReadToEnd();
}
}
return ret;
}
public static T XmlDeserialize<T>(string serializedObject)
{
T retVal = default(T);
byte[] ba = ASCIIEncoding.UTF8.GetBytes(serializedObject);
using (MemoryStream ms = new MemoryStream(ba))
{
XmlSerializer s = new XmlSerializer(typeof(T));
retVal = (T)s.Deserialize(ms);
}
return retVal;
}
序列化后,它将如下所示(我认为这是正确的):
只有元素中也包含文本(例如[0])的换行符仍然存在。另外两个替换为空字符串。如果我在这些元素中添加文本,新行将被保留
查看反序列化中的字节数组,序列化字符串中“\n”所在位置的数组元素变为10(又名LF,新行)。然后,在反序列化过程中,未成功将其转换为“\n”。也许这要求太高了
任何见解都将不胜感激。谢谢。您需要使用和类或
见:
公共静态字符串XmlSerialize(T objectToSerialize)
{
XmlSerializer s=新的XmlSerializer(typeof(T));
var设置=新的XmlWriterSettings
{
NewLineHandling=NewLineHandling.Entitize
};
使用(var stream=new StringWriter())
使用(var writer=XmlWriter.Create(流、设置))
{
s、 序列化(编写器、对象序列化);
返回stream.ToString();
}
}
公共静态XMLT反序列化(字符串序列化对象)
{
XmlSerializer s=新的XmlSerializer(typeof(T));
使用(var stream=newstringreader(serializedObject))
使用(var reader=XmlReader.Create(stream))
{
返回(T)s.反序列化(读取器);
}
}
用法:
public class Foo
{
public string Bar { get; set; }
}
var foo = new Foo { Bar = "\n" };
var result = XmlSerialize(foo);
Console.WriteLine(result);
var newFoo = XmlDeserialize<Foo>(result);
Console.WriteLine(newFoo.Bar);
Debug.Assert(newFoo.Bar == "\n");
公共类Foo
{
公共字符串条{get;set;}
}
var foo=new foo{Bar=“\n”};
var result=XmlSerialize(foo);
控制台写入线(结果);
var newFoo=XmlDeserialize(结果);
控制台写入线(newFoo.Bar);
Assert(newFoo.Bar==“\n”);
谢谢。尽管xml字符串是未格式化的,但这似乎是可行的。有人能解释为什么原始代码只删除列表元素中唯一的新行吗?这就是为什么我看到的你的链接似乎不适用于我。序列化程序删除换行,因为它不认为这是数据。@Romuku-这不是我评论中问题的真正解释。:)此外,只有我的代码中的反序列化方法不能按预期的方式工作。我可以得到我想要的只是用你的反序列化替换我的反序列化。所以很复杂。
<Text>
<string>Zero element text
</string>
<string>[element1]</string>
<string>
</string>
<string>[element3]</string>
<string>
</string>
<string>[element5]</string>
<Text>
[0] = "Zero element text \n"
[1] = "[element1]"
[2] = ""
[3] = "[element3]"
[4] = ""
[5] = "[element5]"
public static string XmlSerialize<T>(T objectToSerialize)
{
XmlSerializer s = new XmlSerializer(typeof(T));
var settings = new XmlWriterSettings
{
NewLineHandling = NewLineHandling.Entitize
};
using(var stream = new StringWriter())
using(var writer = XmlWriter.Create(stream, settings))
{
s.Serialize(writer, objectToSerialize);
return stream.ToString();
}
}
public static T XmlDeserialize<T>(string serializedObject)
{
XmlSerializer s = new XmlSerializer(typeof(T));
using(var stream = new StringReader(serializedObject))
using(var reader = XmlReader.Create(stream))
{
return (T)s.Deserialize(reader);
}
}
public class Foo
{
public string Bar { get; set; }
}
var foo = new Foo { Bar = "\n" };
var result = XmlSerialize(foo);
Console.WriteLine(result);
var newFoo = XmlDeserialize<Foo>(result);
Console.WriteLine(newFoo.Bar);
Debug.Assert(newFoo.Bar == "\n");