【问题标题】:Deserialization error: End of Stream encountered before parsing was completed反序列化错误:在解析完成之前遇到流结束
【发布时间】:2016-06-02 19:26:43
【问题描述】:

我在序列化和反序列化我创建的自定义对象时遇到问题。我不太确定为什么会发生错误,我在我的代码中看不到任何可能直接导致此问题的内容。我已经在没有继承接口的情况下对其进行了测试,它仍然会引发错误。

界面:

public interface ITest
{
    void LoadTest(string id, string className, string classMethod, bool isNegative, List<string> args, string expectedReturn);

    string GetId();
    string GetClassName();
    string GetMethod();
    List<string> GetArgs();
    string GetExpectedReturn();
    bool IsNegative();

    bool HasRan();
    void RunTest(...);

    string GetTestReturn();
    bool GetTestResult();
}

有问题的类被序列化:

[Serializable]
public class TestXML : ITest
{
    private string _id;
    private string _className;
    private string _classMethod;
    private bool _isNegative;
    private List<string> _args;
    private string _expectedReturn;

    private bool _hasRan;

    private string _actualReturn;

    private bool _passOrFail;

    public static string ServerEncodeStatic(TestXML test)
    {
        IFormatter formatter = new BinaryFormatter();

        var ms = new MemoryStream();
        var sr = new StreamReader(ms);

        formatter.Serialize(ms, test);

        ms.Position = 0;

        //TestXML t = (TestXML)formatter.Deserialize(ms); // ERROR occurs here as well if this is uncommented

        var toret = sr.ReadToEnd();

        return toret;
    }

    public static TestXML ServerDecodeStatic(string data)
    {
        IFormatter formatter = new BinaryFormatter();
        using (var ms = new MemoryStream())
        {
            using (var sw = new StreamWriter(ms))
            {
                sw.Write(data);
                sw.Flush();

                ms.Position = 0;
                ms.Seek(0, SeekOrigin.Begin);

                TestXML t = (TestXML)formatter.Deserialize(ms); // ERROR occurs here

                return (TestXML)formatter.Deserialize(ms);
            }
        }
    }

    public void LoadTest(string id, string className, string classMethod, bool isNegative, List<string> args, string expectedReturn)
    {
        _id = id;
        _className = className;
        _classMethod = classMethod;
        _isNegative = isNegative;
        _args = args;
        _expectedReturn = expectedReturn;
    }


    public string GetId()
    {
        return _id;
    }

    public string GetClassName()
    {
        return _className;
    }

    public string GetMethod()
    {
        return _classMethod;
    }

    public List<string> GetArgs()
    {
        return _args;
    }

    public string GetExpectedReturn()
    {
        return _expectedReturn;
    }

    public bool IsNegative()
    {
        return _isNegative;
    }


    public bool HasRan()
    {
        return _hasRan;
    }

    public void RunTest(...)
    {
        ...
    }


    public string GetTestReturn()
    {
        return _actualReturn;
    }

    public bool GetTestResult()
    {
        return _passOrFail;
    }
}

编辑: 我已经重写了这两个函数,它们现在可以工作了!:

    public static string ServerEncodeStatic(TestXML test)
    {
        IFormatter formatter = new BinaryFormatter();
        var ms = new MemoryStream();

        formatter.Serialize(ms, test);

        return Convert.ToBase64String(ms.ToArray());
    }

    public static TestXML ServerDecodeStatic(string data)
    {
        IFormatter formatter = new BinaryFormatter();
        var ms = new MemoryStream(Convert.FromBase64String(data));

        var toret = (TestXML)formatter.Deserialize(ms);

        return toret;
    }

【问题讨论】:

  • 您不能只将输出视为字符串;如果它包含 NUL (Chr(0)),则该字符串将在该点被截断。使用Convert.ToBase64String() 代替流式阅读器
  • 我想在流式阅读器上使用它吗?如果不使用 StreamReader,就无法从 MemoryStream 中取出字符串,对吧?
  • Convert.ToBase64String(ms.ToArray())
  • 好的,所以我仍然无法将其转换回来。我将 sw.write 更新为: sw.Write(Convert.FromBase64String(data));

标签: c# serialization binary


【解决方案1】:

您不能只将输出视为字符串;如果它包含 NUL (Chr(0)),则该字符串将在该点被截断。使用Convert.ToBase64String() 代替StreamReaderStreamWriter。那些是不是你正在使用的文本。

formatter.Serialize(ms, test);
return Convert.ToBase64String(ms.ToArray());

初始化内存流以进行反序列化:

using (var ms = new MemoryStream(Convert.FromBase64String(b64str))
    ...

【讨论】:

  • 这非常有效。我有一种感觉,我什至可以将此代码移植到模板化解决方案中。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-05
  • 1970-01-01
  • 2023-04-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多