更新现有XML文件时出现XML序列化错误

时间:2018-02-11 15:50:24

标签: c# xml xml-serialization

我遇到了一个我在任何帖子中都找不到的问题!当使用新的Object值更新XML文件(通过序列化)时,它仅在新值大于XML中的现有属性值时起作用,但在新值小于现有值时不起作用。

这是我用于序列化的代码

NewFit NF = new NewFit { A1 = CA1.SelectedItem.ToString(), A2 = A2.Text, A3 = A3.Text, A4 = A4.Text, A5 = A5.Text, A6 = A6.Text, A7 = A7.Text, A8 = A8.Text, B1 = B1.Text, B2 = B2.Text, B3 = B3.Text, B4 = B4.Text, B5 = B5.Text, B6 = B6.Text, B7 = B7.Text, B8 = B8.Text, C1 = C1.Text, C2 = C2.Text, C3 = C3.Text, C4 = C4.Text, C5 = C5.Text, C6 = C6.Text, C7 = C7.Text, C8 = C8.Text, D1 = D1.Text, D2 = D2.Text, D3 = D3.Text, D4 = D4.Text, D5 = D5.Text, D6 = D6.Text, D7 = D7.Text, D8 = D8.Text,
            E1 = E1.Text, E2 = E2.Text, E3 = E3.Text, E4 = E4.Text, E5 = E5.Text, E6 = E6.Text, E7 = E7.Text, E8 = E8.Text, F1 = F1.Text, F2 = F2.Text, F3 = F3.Text, F4 = F4.Text, F5 = F5.Text, F6 = F6.Text, F7 = F7.Text, F8 = F8.Text, G1 = G1.Text, G2 = G2.Text, G3 = G3.Text, G4 = G4.Text, G5 = G5.Text, G6 = G6.Text, G7 = G7.Text, G8 = G8.Text, H1 = H1.Text, H2 = H2.Text, H3 = H3.Text, H4 = H4.Text, H5 = H5.Text, H6 = H6.Text, H7 = H7.Text, H8 = H8.Text, I1 = I1.Text, I2 = I2.Text,
            I3 = I3.Text, I4 = I4.Text, I5 = I5.Text, I6 = I6.Text, I7 = I7.Text, I8 = I8.Text, J1 = J1.Text, J2 = J2.Text, J3 = J3.Text, J4 = J4.Text, J5 = J5.Text, J6 = J6.Text, J7 = J7.Text, J8 = J8.Text, K1 = K1.Text, K2 = K2.Text, K3 = K3.Text, K4 = K4.Text, K5 = K5.Text, K6 = K6.Text, K7 = K7.Text, K8 = K8.Text,L1 = L1.Text,L2=L2.Text,L3=L3.Text,L4=L4.Text,L5=L5.Text,L6=L6.Text,L7=L7.Text,L8=L8.Text};

        XmlSerializer serial = new XmlSerializer(typeof(NewFit));
        //JsonConvert.SerializeObject(NF);
        using (FileStream fs = new FileStream(MyCmnd.DocPath, FileMode.Open, FileAccess.Write))
        {

            serial.Serialize(fs, NF);
            fs.Close();
        }

           **example**

如果现有值为<A1>Class 150</A1> 新的价值是“150级AA”然后一切都很好

当现有值为<A1>Class 150</A1>时 并且新值是“Cl1”然后它在根级别给出序列化错误。

谢谢你的时间!

1 个答案:

答案 0 :(得分:0)

理想情况下,您需要提供一个可验证的示例(即您可以复制并粘贴并运行以证明问题的示例),但我猜测FileMode.Open是您的问题。

Serialize只会写入FileStream并在完成时停止。如果你的文件是1000字节而你的新文件较小 - 比方说800字节 - 你最后会有200字节的垃圾。内容几乎肯定是格式错误的XML,当你尝试反序列化时,它会因此而失败。

请改用FileMode.Truncate。每the docs,这将在打开时将其长度设置为0字节:

  

指定操作系统应打开现有文件。打开文件时,应将其截断,使其大小为零字节。

如果您需要处理文件可能尚不存在的情况,请使用FileMode.Create

  

指定操作系统应创建新文件。如果文件已经存在,它将被覆盖... FileMode.Create 等同于请求如果文件不存在,则使用CreateNew;否则,请使用截断。