Сериализация / десериализация командного объекта

Я пытаюсь сериализовать (а затем десериализовать) объект команды в строку (предпочтительно с использованием JavaScriptSerializer). Мой код компилируется, однако, когда я сериализую свой командный объект, он возвращает пустую строку Json, то есть "{}". Код показан ниже.

Цель состоит в том, чтобы сериализовать объект команды, поместить его в очередь, а затем десериализовать его позже, чтобы он мог быть выполнен. Если решение может быть достигнуто с помощью.NET 4, то тем лучше.

ICommand

public interface ICommand
{
    void Execute();
}

Пример команды

public class DispatchForumPostCommand : ICommand
{
    private readonly ForumPostEntity _forumPostEntity;

    public DispatchForumPostCommand(ForumPostEntity forumPostEntity)
    {
        _forumPostEntity = forumPostEntity;
    }

    public void Execute()
    {
        _forumPostEntity.Dispatch();
    }
}

сущность

public class ForumPostEntity : TableEntity
{
    public string FromEmailAddress { get; set; }
    public string Message { get; set; }

    public ForumPostEntity()
    {
        PartitionKey = System.Guid.NewGuid().ToString();
        RowKey = PartitionKey;
    }

    public void Dispatch()
    {
    }
}

Пример пустой строки

public void Insert(ICommand command)
{
   // ISSUE: This serialization returns an empty string "{}".
   var commandAsString = command.Serialize();
}

Метод расширения сериализации

public static string Serialize(this object obj)
{
    return new JavaScriptSerializer().Serialize(obj);
}

Любая помощь будет оценена.

1 ответ

Решение

Ваш класс DispatchForumPostCommand не имеет свойств для сериализации. Добавьте публичное свойство для его сериализации. Как это:

public class DispatchForumPostCommand : ICommand {
    private readonly ForumPostEntity _forumPostEntity;

    public ForumPostEntity ForumPostEntity { get { return _forumPostEntity; } }

    public DispatchForumPostCommand(ForumPostEntity forumPostEntity) {
        _forumPostEntity = forumPostEntity;
    }

    public void Execute() {
        _forumPostEntity.Dispatch();
    }
}

Теперь я получаю следующее как сериализованный объект (я убрал наследование TableEntity для целей тестирования):

{"ForumPostEntity":{"FromEmailAddress":null,"Message":null}}

Если вы также хотите десериализовать объект, вам нужно будет добавить открытый установщик для свойства, иначе десериализатор не сможет его установить.

Другие вопросы по тегам