C# 使用“反序列化字符串列表”\";结果为空字符串

C# 使用“反序列化字符串列表”\";结果为空字符串,c#,xml,xml-serialization,newline,xmlserializer,C#,Xml,Xml Serialization,Newline,Xmlserializer,我已经在这上面撞了一段时间了。看起来这一定是一个简单的解决方案,但我已经在互联网上搜索并尝试了很多东西 我有一个复杂的对象,它包含一个字符串列表,需要序列化为xml,然后反序列化 序列化代码早已成为应用程序的一部分,并在无数其他场景中工作,但这里的问题似乎是字符串列表中的一个元素仅仅是一个新行字符(即“\n”) 我的理解是,根据我的研究,它按预期进行序列化(见下文),但反序列化后,元素包含一个空字符串(即“”),而不是“\n” 这是代码 public DoStuff(ItemTypeObj it

我已经在这上面撞了一段时间了。看起来这一定是一个简单的解决方案,但我已经在互联网上搜索并尝试了很多东西

我有一个复杂的对象,它包含一个字符串列表,需要序列化为xml,然后反序列化

序列化代码早已成为应用程序的一部分,并在无数其他场景中工作,但这里的问题似乎是字符串列表中的一个元素仅仅是一个新行字符(即“\n”)

我的理解是,根据我的研究,它按预期进行序列化(见下文),但反序列化后,元素包含一个空字符串(即“”),而不是“\n”

这是代码

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");