Определение аргумента универсального типа в интерфейсе разработано так, чтобы при десериализации объекта данного типа требовались безопасные для типа результаты определенного типа.
Конкретный вариант использования не имеет смысла для меня, потому что вам нужно иметь экземпляр объекта, чтобы десериализовать другой экземпляр - что обычно не так, как вы хочу пойти.
Я понимаю, что вы хотите требовать наличия строго типизированного десериализатора, но имеет смысл использовать какой-то другой шаблон (например, Factory)
Кроме того, ваши входные данные являются байтами [] - если нет каких-либо других метаданных, у вас нет возможности узнать, какой из ITCPSerializable
необходимо вызвать, чтобы получить правильный конкретный тип.
Информация о типе может содержаться в данных (т. Е. В каком-то заголовке, который включает в себя информацию о типе) или в каком-либо другом контракте (т. Е. Всегда того же типа).
Метод сериализации имеет смысл - потому что разумно запрашивать объект для сериализованного экземпляра самого себя, но наоборот, обычно это делается другими способами.
Таким образом, решение вашей проблемы состояло бы в том, чтобы удалить определение универсального типа (которое вам не помогает) и метод Deserialize (который не имеет смысла в этом контексте), и просто оставить метод Serialize.
как в:
public interface ITcpSerializable
{
Byte[] Serialize();
}
И реализовать десериализацию с использованием фабрики.