2009-10-20 4 views
1

Я хотел бы переопределить методы Serialize класса ASP.NET JavaScriptSerializer. Ничего особенного, я просто хочу сделать дополнительную пост-обработку для сериализованной строки, возвращаемой из .NET.расширение класса, который не реализует интерфейс

К сожалению, ни один из методов этого класса не объявлен виртуальным, а сам класс не является результатом интерфейса или абстрактного класса (кажется, это странный недосмотр, учитывая, что многие из основных классов .NET Framework предназначены для расширяемости) ,

Основываясь на некотором чтении, которое я сделал по этому вопросу, похоже, что у меня есть несколько вариантов на выбор.

  • Создать метод расширения. Я не являюсь большим поклонником этой опции, так как она включает в себя создание нового метода (компилятор не позволит использовать одно и то же имя/подпись дважды), о котором должны знать пользователи класса.

  • Вывести новый класс из JavaScriptSerializer, который имеет ту же подпись. Поскольку JavaScriptSerializer не имеет виртуальных методов, я бы использовал «новое» ключевое слово в каждом объявлении метода/свойства, чтобы выполнить скрытие метода. I думаю этот вариант считается декоратором?

  • Создайте новый интерфейс под названием IJavaScriptSerializer, который будет иметь ту же подпись, что и JavaScriptSerializer. Удалите все ссылки в моем коде JavaScriptSerializer и замените ссылки на вновь созданный интерфейс.

Мне бы хотелось услышать о дополнительных подходах и плюсах/минусах каждого подхода.

Спасибо, что нашли время для чтения.

ответ

3

Вы Непонимание Decorator Pattern, который ссылается на объект, который наследует класс и оборачивает другой экземпляр этот класс. (Это очень часто для потоков). В вашем случае это неприменимо.

Я бы порекомендовал вам сделать свою собственную замену (или оболочку, в зависимости от того, что вам нужно) для класса JavaScriptSerializer, не пытаясь иметь идентичный API. Если вам нужно иметь возможность своп-реализации, я бы сделал интерфейс или базовый класс с основными методами и имел две конкретные реализации, один из которых обертывал оригинал и один добавлял вашу пост-обработку.

В целом при проектировании классов вы должны проектироваться в соответствии с вашими потребностями, а не копировать встроенные классы .Net Framework.

+1

Это мой 400-й ответ! – SLaks

+0

И теперь у вас более 9000 ответов! :) 10 555, если быть точным. Спасибо, что так много помогли! –

0

Перейти к http://json.org и d/l один из нескольких классов, имеющих исходный код, для сериализации JSON.

Затем добавьте свою пост-обработку, скомпилируйте и используйте в своем проекте.

В идеале, в этот момент я хотел бы создать метод расширения, так что я могу просто сделать это:

List<MyObject> s = fillObject(); 
return s.ToJSON(); 
Смежные вопросы