相关疑难解决方法(0)

检查是否给出完整路径

有没有一种方法可以检查给定路径是否为完整路径?现在我这样做:

if (template.Contains(":\\")) //full path already given
{
}
else //calculate the path from local assembly
{
}
Run Code Online (Sandbox Code Playgroud)

但是必须有更优雅的方式来检查这个?

.net c# validation path

97
推荐指数
8
解决办法
4万
查看次数

Newtonsoft Json中的TypeNameHandling警告

这个链接上,在备注部分提到了" TypeNameHandling".在什么情况下,如果使用序列化/反序列化来自外部源的JSON会有害SerializationBinder?一个工作的例子将不胜感激.

c# serialization json.net

20
推荐指数
2
解决办法
7842
查看次数

内置的基于BinaryFormatter的.Net序列化有哪些不足之处?

内置的基于BinaryFormatter的.Net序列化有哪些不足之处?(性能,灵活性,限制)

如果可能的话,请附上一些代码.

例:

要序列化的自定义对象必须使用[Serializable]属性进行修饰或实现ISerializable接口.

不太明显的例子:

匿名类型无法序列化.

.net serialization

16
推荐指数
1
解决办法
4399
查看次数

BinaryFormatter替代品

BinaryFormatter序列化的128³双倍阵列,占用50 MB的空间.序列化128个结构的数组有两个字段需要150 MB,处理时间超过20秒.

是否有快速简单的替代品可以生成压缩文件?我的期望是上面的例子分别占用16和32 MB,并且在两秒钟内处理.我看了一下protobuf-net,但看起来它甚至不支持struct数组.

PS:我为记录文件大小时出错而道歉.BinaryFormatter的实际空间开销并不大.

.net binaryformatter

13
推荐指数
2
解决办法
9759
查看次数

BinaryFormatter反序列化给出了SerializationException

我得到了:

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)

.net serialization exception binaryformatter

13
推荐指数
2
解决办法
1万
查看次数

外部json因为Json.Net TypeNameHandling auto而易受攻击?

我正在运营一个小型网站,用户可以上传JSON中定义的自定义"对象".最近我了解了使用JSON进行自动类型反序列化的可能威胁:JSON问题.我想我理解了问题,但我必须要求确定.如果我只使用给定的特定类型(此处MyObject)反序列化传入的JSON,JsonConvert.DeserializeObject<MyObject>(json, settings);并且内部MyObject没有类型,并且没有类型的任何成员的子MyObject类型,System.Object或者dynamic没有什么可以变坏,对吧?

TypeNameHandlingsettings设置为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.Objectdynamic类型字段,obj我可以重现威胁.但是我想要知道的是:即使MyObject是一个非常复杂的对象,有很多(派生的)子对象,但是没有准备好的user-json我也是安全的,但是它们中没有一个是或者有一个System.Object或一个动态字段(也是不是喜欢的东西List<Object>)?例如,我可以想象,$type即使没有MyObject找到相应的字段,Json.NET 也会像创建对象那样做.

c# json.net

11
推荐指数
1
解决办法
3248
查看次数

如何为二进制格式化程序创建SerializationBinder,以处理从一个程序集和名称空间到另一个程序集和名称空间的类型移动

背景如下

  1. 我想通过将代码移动到不同的项目来重构代码
  2. 其中一些代码包含可序列化的DTO,用于跨多个端点发送和接收数据
  3. 如果我移动代码,序列化中断(因此它不能与我的应用程序的旧版本向后兼容)

这个问题的解决方案是SerializationBinder,它允许我在某种意义上从一种类型"重定向"到另一种类型.

因此,我想创建一个SerializationBinder来满足这种需求.但是,它必须满足以下要求

  1. SerializationBinder的输入应该是旧类型到新类型映射的列表.映射应包括旧程序集名称(无版本,无公钥标记)和类型的旧全名(名称空间和名称)以及新程序集名称和类型的新全名
  2. 对于输入中的类型,应忽略程序集的版本号
  3. 如果我的类型恰好在泛型(List,Dictionary等)中,它应该处理泛型,而不需要在输入中包含泛型
  4. 对于不在输入中的任何内容(例如,未移动的类型或.NET类型,例如数据集),它应该默认使用二进制序列化器的开箱即用算法

这可能还是我在做梦?那里有什么东西已经做到了吗?我认为这是一个常见的问题.

到目前为止,我认为没有简单的方法可以做到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

9
推荐指数
2
解决办法
5268
查看次数

动态加载类型的 SerializationException

由于我之前的问题(接口的 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)

.net c# dll serialization dynamic

1
推荐指数
1
解决办法
1512
查看次数