2013-03-07 4 views
0

Я пытаюсь сериализовать (и позже десериализовать) объект команды на строку (желательно с помощью JavaScriptSerializer). Мой код компилируется, однако, когда я сериализую свой объект команды, он возвращает пустую строку Json, т. Е. «{}». Код показан ниже.Сериализация/Deserializing Command Object

Цель состоит в том, чтобы сериализовать командный объект, поместить его в очередь, а затем десериализовать его позже, чтобы он мог быть выполнен. Если решение может быть достигнуто с помощью .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); 
} 

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

+0

«ICommand» содержит только один метод. какой результат сериализации вы ожидаете? – andri

+0

Скорее всего (хотя я и не использовал сериализатор Java), что вам нужно пометить ваши классы, которые наследуют от 'ICommand', с помощью' [Serializable] 'и помечать каждое свойство в этом классе как' XmlElement'. – MoonKnight

+0

Строковое представление DispatchForumPostCommand или другого объекта, который наследуется от ICommand. После того, как объект снят с очереди и десериализован, я хочу вызвать команду Execute, которая содержит некоторую базовую информацию, которая поможет завершить выполнение. – Bern

ответ

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}} 

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

+0

Genius. FYI этот подход работает с наследованием TableEntity. Спасибо @Maarten – Bern

+0

Незначительная опечатка Я не могу отредактировать, потому что она меньше 10 символов «имеет свойства» => «не имеет свойств» – Bern

+1

@ Берн просто видел, что тоже исправлено. – Maarten