标签: binary-serialization

在ILMerge之后,BinaryFormatter.Deserialize"无法找到程序集"

我有一个带有引用的dll的C#解决方案(也是具有相同.Net版本的C#).当我构建解决方案并运行生成的exe,而不合并exe和引用的DLL时,一切正常.

现在我想将这些合并到一个exe中.我运行ILMerge,一切似乎都正常.我尝试执行exe,它似乎运行正常,直到它尝试反序列化引用的DLL中定义的对象.

using (Stream fstream = new FileStream(file_path, FileMode.Open))
{
    BinaryFormatter bf = new BinaryFormatter();
    return bf.Deserialize(fstream) as ControlledRuleCollection; 
    // throws unable to find assembly exception
}
Run Code Online (Sandbox Code Playgroud)

可能有一些ILMerge选项我在这里丢失了吗?

c# ilmerge binary-serialization

12
推荐指数
3
解决办法
2万
查看次数

DeflateStream不能在MemoryStream上运行?

我有以下代码:

MemoryStream resultStream = new MemoryStream();
string users = ""//Really long string goes here
BinaryFormatter bFormatter = new BinaryFormatter();
using (MemoryStream assignedUsersStream = new MemoryStream())
{
    bFormatter.Serialize(assignedUsersStream, users);
    assignedUsersStream.Position = 0;

    using (var compressionStream =
        new DeflateStream(resultStream, CompressionLevel.Optimal))
    {
        assignedUsersStream.CopyTo(compressionStream);

        Console.WriteLine("Compressed from {0} to {1} bytes.",
            assignedUsersStream.Length.ToString(),
            resultStream.Length.ToString());
    }
}            
Run Code Online (Sandbox Code Playgroud)

事情是resultStream永远是空的!

我在这做错了什么?

c# serialization memorystream deflate binary-serialization

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

如何针对已更改的类型反序列化旧数据?

我有使用二进制序列化为以下类存储的数据:

[Serializable]
public abstract class BaseBusinessObject
{
    private NameValueCollection _fieldErrors = new NameValueCollection();

    protected virtual NameValueCollection FieldErrors
    {
        get { return _fieldErrors; }
        set { _fieldErrors = value; }
    }

    ...
}
Run Code Online (Sandbox Code Playgroud)

在某些时候,课程改为:

[Serializable]
public abstract class BaseBusinessObject
{
    private Dictionary<string, string> _fieldErrors = new Dictionary<string, string>();

    protected virtual Dictionary<string, string> FieldErrors
    {
        get { return _fieldErrors; }
        set { _fieldErrors = value; }
    }

    ...
}
Run Code Online (Sandbox Code Playgroud)

这导致了对旧数据进行反序列化的问题.

我的第一个想法是实现ISerializable,但是这个类有许多属性以及数百个继承类,我也必须实现它.

我想在反序列化期间更改旧数据以匹配当前结构,或者有一种干净的升级旧数据的方法.

c# serialization binary-serialization

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

如何为二进制格式化程序创建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
查看次数

我还应该在.NET 4.0中使用BinaryFormatter进行简单序列化吗?

我正在开发一个主从式应用程序.主应用程序将状态数据发送到从属设备以处理并以某种恒定速率显示.状态数据被包装到包含许多字段的单个类中.这些字段类型包括基元,类,接口,接口列表等.所有类型都是BCL或自定义类型,因此可以根据需要修改自定义类型.主应用程序和从属应用程序都是.NET 4.0.我不关心序列化版本控制,因为主应用程序和从属应用程序将作为一对交付.

我需要一种"快速"的方法来序列化主服务器上的状态数据并在服务器上反序列化它.当我说"快"时,我更谈论开发时间(但如果解决方案很糟糕,处理时间可能是一个因素).但是,主设备和从设备将分布在WAN上,因此某种程度的紧凑性也会很好.

为了快速解决方案,我目前正在考虑简单地使用BinaryFormatter然后压缩流GZipStream.这是.NET 4.0的方法吗?

.net c# performance serialization binary-serialization

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

一个类/对象必须改变多少才能使二进制反序列化失败

我们有一个解决方案,我们将一个相当大/复杂的 C# 对象作为二进制数据存储在我们的数据库中。我担心的是,当对这个类进行更改时,我们冒着保存到数据库的数据在代码更改后反序列化失败的风险。

这是我们用来序列化对象的代码:

    public static byte[] SerializeObject(object toBeSerialized)
    {
        var stream = new MemoryStream();
        var serializer = new BinaryFormatter();
        serializer.Serialize(stream, toBeSerialized);
        stream.Position = 0;
        return stream.ToArray();
    }
Run Code Online (Sandbox Code Playgroud)

这是我们的反序列化方法:

    public static T DeserializeObject<T>(byte[] toBeDeserialized)
    {
        using (var input = new MemoryStream(toBeDeserialized))
        {
            var formatter = new BinaryFormatter();
            input.Seek(0, SeekOrigin.Begin);
            return (T) formatter.Deserialize(input);
        }
    }
Run Code Online (Sandbox Code Playgroud)

我的问题是,为了使旧对象的反序列化失败,必须改变什么/必须改变多少?

.net c# binary-serialization binary-deserialization

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

对于新的 .net core 应用程序,我应该在 protobuf-net 和 google.protobuf 之间使用什么 NuGet 包?

对于新的 .net core 应用程序,我应该在 protobuf-net 和 google.protobuf 之间使用什么 NuGet 包?

  • 这是为了“代码第一”,而不是合同第一。
  • 它实际上仅适用于 C#,但如果更多语言可以轻松读取该格式(但不是必须的),那就太好了。对于二进制序列化,我更看重性能而不是可移植性。我还将使用 XML 或 Json 来实现可移植性(我认为这更适合可移植性,尽管速度慢很多)。

c# performance serialization protobuf-net binary-serialization

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

反序列化为其名称空间已更改的类型

使用.NET 4/C#...

我需要反序列化包含名为ns1.X的类型的序列化表示的旧配置文件.序列化已经完成了BinaryFormatter.

问题是,经过一轮重构后,类型X已被移动到另一个名称空间,比如ns2.X.

我尝试创建一个从ns2.X派生的新的空ns1.X类型,虽然这绕过了' 找不到类型ns1.X '错误,但反序列化对象中的属性都是null.此外,在此过程中没有调用ctors.

有什么建议?

.net c# serialization binaryformatter binary-serialization

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

二进制序列化与JSON与xml的对比

有没有人知道在时间方面,当使用二进制序列化而不是JSON与xml并通过网络发送数据时,如果数据结构有很多小(字符串)字段,那么性能增益是多少?

串行器对性能有何影响?编程语言怎么样?

我们忽略了可移植性问题的完美场景,我们假设我们可以处理所有3种格式的序列化/反序列化所需的库.

xml serialization json binary-serialization deserialization

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

没有对象定义的二进制反序列化

我正在尝试读取二进制序列化对象,我没有它的对象定义/源.我在文件中找到了一个峰值并看到了属性名称,因此我手动重新创建了对象(让我们称之为SomeDataFormat).

我最终得到了这个:

public class SomeDataFormat // 16 field
{
    public string Name{ get; set; }
    public int Country{ get; set; } 
    public string UserEmail{ get; set; }
    public bool IsCaptchaDisplayed{ get; set; }
    public bool IsForgotPasswordCaptchaDisplayed{ get; set; }
    public bool IsSaveChecked{ get; set; }
    public string SessionId{ get; set; } 
    public int SelectedLanguage{ get; set; } 
    public int SelectedUiCulture{ get; set; } 
    public int SecurityImageRefId{ get; set; } 
    public int LogOnId{ get; set; } 
    public bool BetaLogOn{ …
Run Code Online (Sandbox Code Playgroud)

.net c# serialization binary-serialization deserialization

6
推荐指数
2
解决办法
5033
查看次数