Получение ошибки десериализации с DataContractSerializer - PullRequest
1 голос
/ 13 сентября 2011

Когда я возвращаю свой объект обратно в исходный тип, мой объект всегда равен null.

Вот мой код:

ProjectSetup obj = new ProjectSetup();

if (System.Web.HttpContext.Current.Session["ProjectSetup"] == null)
    setBookProjectSetup();

string toDeserialise = System.Web.HttpContext.Current.
    Session["ProjectSetup"].ToString();

DataContractSerializer dcs = new DataContractSerializer(typeof(ProjectSetup));
MemoryStream ms = new MemoryStream(Encoding.UTF8.GetBytes(toDeserialise));
obj = (ProjectSetup) dcs.ReadObject(ms, true);

return obj;

1 Ответ

0 голосов
/ 13 сентября 2011

Я собираюсь предположить, что вызов setBookProjectSetup помещает экземпляр ProjectSetup в HttpSessionState с ключом ProjectSetup.

Проблема здесь начинается с этого:

string toDeserialise = System.Web.HttpContext.Current.
    Session["ProjectSetup"].ToString();

Вы впоследствии используете содержимое строки toDeserialize в качестве источника десериализации.

Если вы не перегружены ToString для возврата байтаПоток, который DataContractSerializer сможет десериализовать (очень маловероятно), есть вероятность, что вы используете реализацию ToString на Object, которая будет просто возвращать имя типа.

Затем вы пытаетесь десериализовать эту строку в ваш объект, который не будет работать.

Что вам нужно сделать, это правильно сериализовать ваш объект в байтовый массив / MemoryStream, вот так:

using (var ms = new MemoryStream())
{
    // Create the serializer.
    var dcs = new DataContractSerializer(typeof(ProjectSetup));

    // Serialize to the stream.
    dcs.WriteObject(ms, System.Web.HttpContext.Current.Session["ProjectSetup"]);

На этом этапе MemoryStream будет заполнен серией байтов, представляющих ваш сериализованный объект.Затем вы можете вернуть объект, используя тот же MemoryStream:

    // Reset the position of the stream so the read occurs in the right place.
    ms.Position = 0;

    // Read the object.
    var obj = (ProjectSetup) dcs.ReadObject(ms);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...