有没有一种方法可以检查给定路径是否为完整路径?现在我这样做:
if (template.Contains(":\\")) //full path already given
{
}
else //calculate the path from local assembly
{
}
Run Code Online (Sandbox Code Playgroud)
但是必须有更优雅的方式来检查这个?
在这个链接上,在备注部分提到了" TypeNameHandling".在什么情况下,如果使用序列化/反序列化来自外部源的JSON会有害SerializationBinder?一个工作的例子将不胜感激.
内置的基于BinaryFormatter的.Net序列化有哪些不足之处?(性能,灵活性,限制)
如果可能的话,请附上一些代码.
例:
要序列化的自定义对象必须使用[Serializable]属性进行修饰或实现ISerializable接口.
不太明显的例子:
匿名类型无法序列化.
BinaryFormatter序列化的128³双倍阵列,占用50 MB的空间.序列化128个结构的数组有两个双字段需要150 MB,处理时间超过20秒.
是否有快速简单的替代品可以生成压缩文件?我的期望是上面的例子分别占用16和32 MB,并且在两秒钟内处理.我看了一下protobuf-net,但看起来它甚至不支持struct数组.
PS:我为记录文件大小时出错而道歉.BinaryFormatter的实际空间开销并不大.
我得到了:
System.Runtime.Serialization.SerializationException:无法找到程序集'myNameSpace,Version = 1.0.0.0,Culture = neutral,PublicKeyToken = null
当试图反序列化另一个程序中的某些数据而不是我用它序列化的程序时.
经过一些谷歌搜索,我发现显然这只能使用共享程序集完成.
但是,我的数据库已满了这个序列化对象,我需要一个实用程序来解决它们.有没有办法覆盖这种行为,只是提供完全相同的类,并强制它反序列化?
我已经找到了这个片段,但我不明白应该如何以及在哪里放置/使用它.
static constructor() {
AppDomain.CurrentDomain.AssemblyResolve += new ResolveEventHandler(CurrentDomain_AssemblyResolve);
}
static Assembly CurrentDomain_AssemblyResolve(object sender, ResolveEventArgs args) {
Assembly ayResult = null;
string sShortAssemblyName = args.Name.Split(',')[0];
Assembly[] ayAssemblies = AppDomain.CurrentDomain.GetAssemblies();
foreach (Assembly ayAssembly in ayAssemblies) {
if (sShortAssemblyName == ayAssembly.FullName.Split(',')[0]) {
ayResult = ayAssembly;
break;
}
}
return ayResult;
}
Run Code Online (Sandbox Code Playgroud) 我正在运营一个小型网站,用户可以上传JSON中定义的自定义"对象".最近我了解了使用JSON进行自动类型反序列化的可能威胁:JSON问题.我想我理解了问题,但我必须要求确定.如果我只使用给定的特定类型(此处MyObject)反序列化传入的JSON,JsonConvert.DeserializeObject<MyObject>(json, settings);并且内部MyObject没有类型,并且没有类型的任何成员的子MyObject类型,System.Object或者dynamic没有什么可以变坏,对吧?
TypeNameHandling的settings设置为TypeNameHandling.Auto(我们不要质疑这个决定,它可能可以与工作None,但我想了解的问题将其设置为Auto.)
编辑:更多信息:我已经测试了前面提到的网站中的JSON:
{
"obj": {
"$type": "System.IO.FileInfo, System.IO.FileSystem",
"fileName": "rce-test.txt",
"IsReadOnly": true
}
}
Run Code Online (Sandbox Code Playgroud)
如果MyObject有一个System.Object或dynamic类型字段,obj我可以重现威胁.但是我想要知道的是:即使MyObject是一个非常复杂的对象,有很多(派生的)子对象,但是没有准备好的user-json我也是安全的,但是它们中没有一个是或者有一个System.Object或一个动态字段(也是不是喜欢的东西List<Object>)?例如,我可以想象,$type即使没有MyObject找到相应的字段,Json.NET 也会像创建对象那样做.
背景如下
这个问题的解决方案是SerializationBinder,它允许我在某种意义上从一种类型"重定向"到另一种类型.
因此,我想创建一个SerializationBinder来满足这种需求.但是,它必须满足以下要求
这可能还是我在做梦?那里有什么东西已经做到了吗?我认为这是一个常见的问题.
到目前为止,我认为没有简单的方法可以做到3而且完全不做4.
这是一次尝试
public class SmartDeserializationBinder : SerializationBinder
{
/// <summary>
/// Private class to handle storing type mappings
/// </summary>
private class TypeMapping
{
public string OldAssemblyName { get; set; }
public string OldTypeName { get; set; }
public string NewAssemblyName { get; set; }
public string NewTypeName { get; set; }
}
List<TypeMapping> typeMappings;
public SmartDeserializationBinder()
{
typeMappings = new List<TypeMapping>();
}
public void AddTypeMapping(string oldAssemblyName, string oldTypeName, …Run Code Online (Sandbox Code Playgroud) .net c# serialization backwards-compatibility binary-serialization
由于我之前的问题(接口的 XML 序列化),我遇到了另一个问题......
我有一个从数据库导出数据的应用程序。导出过程由实现用于调用的公共接口的不同具体类实现。
具体的实现是作为插件 (DLL) 加载的,所以我不会在我的代码中直接引用它们。
我需要将这些具体类的实例作为字节数组序列化到我的数据库中,但是现在当我尝试从字节数组中反序列化它们时,我获得了一个 SerializationException: Unable to find assembly …
我想它是因为我在运行时加载了带有接口的具体实现的 dll ......
我该如何解决?
注意 我使用此代码反序列化对象:
public static object DeSerialize(byte[] arrayToDeSerialize)
{
object serializedObject;
using (MemoryStream stream = new MemoryStream(arrayToDeSerialize))
{
//Creating binary formatter to De-Serialize string.
BinaryFormatter formatter = new BinaryFormatter();
//De-Serializing.
serializedObject = formatter.Deserialize(stream);
}
return serializedObject;
}
Run Code Online (Sandbox Code Playgroud)