Я ищу некоторые указания относительно того, что происходит при использовании протобуф-сети с обфускацией (Dotfuscator). Одна половина проекта - это DLL, а другая - EXE-файл, и с помощью proto-buf NET они безошибочно обмениваются данными. Пока я не запутываю DLL.
В этот момент P-BN завершается неудачно, не вызывая исключения, возвращая по-разному байтовый массив длиной 0 или ракурс в зависимости от того, с чем я возился. Класс довольно прост (VB):
<ProtoContract(Name:="DMailer")> _
Friend Class DMailer
Private _Lic As Cert
Private _Sys As Sys
Private _LList As List(Of LItem)
..
..
End Class
Есть 3 реквизита, все украшенные ProtoMember, чтобы получить / установить составляющие объекты класса. Отрезал для краткости.
Снова, это работает БОЛЬШОЙ, пока я не запутываю DLL. Затем Dotfuscator переименовывает каждый из них в ноль, по-видимому, так как все они Friend, и это, кажется, душит прото-бафф. Если я освобождаю класс от переименования (только имя класса, а не реквизиты / члены), он снова работает. Имеет смысл, что P-BN сможет работать только с объектами с правильным именем, хотя при запросе сериализации объекта с нулевым именем кажется, что исключение может быть в порядке.
С другой стороны, большая часть прелести PB-N заключается в сериализации независимых имен .NET, работающих с атрибутами - по крайней мере, насколько я понимаю. Однако в этом случае кажется, что он работает только с классами с именами. Я попытался использовать квалификатор или аргумент Name, как показано выше, но безрезультатно - он явно не выполняет то, что, как я думал, может.
Итак, мне любопытно, если:
а) ... Я в основном правильно предположил проблему
b) ... Существует какой-то другой атрибут или флаг, который может облегчить сериализацию
объект с нулевым именем
в) ... если есть какие-то другие идеи, которые могут помочь.
Если я освобождаю все 3 или 4 класса от переименования Dotfuscator (LList еще не реализован, оставляя DMailer, Cert и Sys), DLL снова работает - по крайней мере, вывод имеет правильный размер. Я могу с этим смириться, хотя затемненные имена были бы лучше: Dotfuscator (CE) либо исключает их, либо задает имена равными Null - мне кажется, я не могу найти способ заставить их переименовать.
Вместо того, чтобы освобождать 3 или 4 класса от переименования, я рассматриваю одну альтернативу - просто сохранить выходные данные Serializer для Cert и Sys как байтовые массивы или строки Base64 в DMailer вместо классов. Затем пусть получатель десериализует каждый объект индивидуально. Приятно иметь возможность распаковывать только одну вещь и иметь свои игрушки прямо там, как по волшебству.
(много) ТИА