我使用Json.Net对类进行序列化和非序列化。当我试图混淆程序集中的类时,我将无法正确地取消JSON字符串的序列化。我尝试过使用JsonProperty属性,但它仍然不能正确地取消序列化。
有谁知道如何绕开这件事,而不是让全班都不沉迷于此呢?
提前谢谢。
更新:
我为JSON对象创建了一个简单的类,如下所示:
public class JsonTestClass
{
[JsonProperty("JsonID")]
public int Id { get; set; }
[JsonProperty("JsonName")]
public string Name { get; set; }
[JsonProperty("JsonYesNo")]
public bool YesNo { get; set; }
}将JsonTestClass对象序列化为Json字符串的代码是:
//Serialize
var jsonObj = new JsonTestClass()
{
Id = 1,
Name = "John",
YesNo = true,
};
var JsonStr = JsonConvert.SerializeObject(jsonObj);
Trace.WriteLine(">>" + JsonStr);并将Json字符串反序列化为JsonTestClass,如下所示:
//Unserialize
var JsonStr = "{\"JsonID\":1,\"JsonName\":\"John Abc\",\"JsonYesNo\":true}";
Trace.WriteLine("<<" + JsonStr);
var jsonObj = JsonConvert.DeserializeObject<JsonTestClass>(JsonStr);
if (jsonObj == null)
{
Trace.WriteLine("-- JsonObj is null");
}
else
{
Trace.WriteLine(string.Format("-- Id={0} Name={1} YesNo={2}", jsonObj.Id, jsonObj.Name, jsonObj.YesNo));
}所有操作都很好,没有模糊,用于序列化的调试输出是:
[64200] >>{"JsonID":1,"JsonName":"John Abc","JsonYesNo":true} 反序列化的调试输出是:
[64200] <<{"JsonID":1,"JsonName":"John Abc","JsonYesNo":true}
[64200] -- Id=1 Name=John Abc YesNo=True 在程序集被模糊化(使用SmartAssembly来模糊这个程序集)和使用dotPeek查看模糊程序集之后,唯一一个有点类似于SmartAssembly的程序集是:
namespace
{
internal class
{
}
}用于序列化的调试输出是:
[65956] >>{} 反序列化的调试输出是:
[65956] <<{"JsonID":1,"JsonName":"John Abc","JsonYesNo":true}
[65956] -- Id=0 Name= YesNo=False 希望这能帮你理清问题。
发布于 2018-10-16 11:22:37
如果您使用的是Visual 15和Visual 17附带的以Community形式提供的Dotfuscator,则必须从重命名时排除序列化对象的属性名称。您可以在Dotfuscator重命名选项卡中这样做。
之后,您可以像普通一样序列化和反序列化。
您可以在Preemtive解决方案网站的支持角找到详细的描述这里。
发布于 2022-11-03 00:59:39
有几个选项,取决于您对可维护性、安全性等的偏好。
从混淆中排除属性
如果您只关心被混淆的类型名称,而不是属性名称,那么您可以用混淆属性来修饰每个要序列化的属性。(下面是Dotfuscator对此属性的支持的链接。)基本上,通过将属性从重命名中排除,这将允许Json.NET轻松地标识要设置的属性。
[Obfuscation(Exclude=true, Feature="renaming")]
public int MyProperty { get; set; }公开用于反序列化的私有备份字段。
另一种让Json.NET反序列化模糊类的方法是使用JsonProperty属性将反序列化的目标从公共属性更改为私有字段。
[JsonProperty("a")]
private int _myField;
[JsonIgnore]
public int MyProperty
{
get => _myField;
set => _myField = value;
}注意:如果在"MyProperty"属性中使用nameof(MyProperty)或nameof(MyProperty),那么根据混淆设置的不同,很有可能将其作为"MyProperty"编译到.dll中,从而降低了最初试图通过混淆实现的总体安全性。
注2:当使用MVVM设计模式时,此解决方案很可能无法工作。在使用此模式时,常见的编码实践是利用属性设置器引发INotifyPropertyChanged事件。但是,使用JsonProperty和JsonIgnore属性将导致Json.NET使用反射而不是via属性设置私有字段的值。因此,将不会引发更改事件,从而使这在此特定场景中成为一个糟糕的解决方案。
INotifyPropertyChanged功能,这取决于您的实现细节。https://stackoverflow.com/questions/27978422
复制相似问题