我有一个带有引用的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选项我在这里丢失了吗?
我有以下代码:
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永远是空的!
我在这做错了什么?
我有使用二进制序列化为以下类存储的数据:
[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,但是这个类有许多属性以及数百个继承类,我也必须实现它.
我想在反序列化期间更改旧数据以匹配当前结构,或者有一种干净的升级旧数据的方法.
背景如下
这个问题的解决方案是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
我正在开发一个主从式应用程序.主应用程序将状态数据发送到从属设备以处理并以某种恒定速率显示.状态数据被包装到包含许多字段的单个类中.这些字段类型包括基元,类,接口,接口列表等.所有类型都是BCL或自定义类型,因此可以根据需要修改自定义类型.主应用程序和从属应用程序都是.NET 4.0.我不关心序列化版本控制,因为主应用程序和从属应用程序将作为一对交付.
我需要一种"快速"的方法来序列化主服务器上的状态数据并在服务器上反序列化它.当我说"快"时,我更谈论开发时间(但如果解决方案很糟糕,处理时间可能是一个因素).但是,主设备和从设备将分布在WAN上,因此某种程度的紧凑性也会很好.
为了快速解决方案,我目前正在考虑简单地使用BinaryFormatter然后压缩流GZipStream.这是.NET 4.0的方法吗?
我们有一个解决方案,我们将一个相当大/复杂的 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 core 应用程序,我应该在 protobuf-net 和 google.protobuf 之间使用什么 NuGet 包?
c# performance serialization protobuf-net binary-serialization
使用.NET 4/C#...
我需要反序列化包含名为ns1.X的类型的序列化表示的旧配置文件.序列化已经完成了BinaryFormatter.
问题是,经过一轮重构后,类型X已被移动到另一个名称空间,比如ns2.X.
我尝试创建一个从ns2.X派生的新的空ns1.X类型,虽然这绕过了' 找不到类型ns1.X '错误,但反序列化对象中的属性都是null.此外,在此过程中没有调用ctors.
有什么建议?
有没有人知道在时间方面,当使用二进制序列化而不是JSON与xml并通过网络发送数据时,如果数据结构有很多小(字符串)字段,那么性能增益是多少?
串行器对性能有何影响?编程语言怎么样?
我们忽略了可移植性问题的完美场景,我们假设我们可以处理所有3种格式的序列化/反序列化所需的库.
我正在尝试读取二进制序列化对象,我没有它的对象定义/源.我在文件中找到了一个峰值并看到了属性名称,因此我手动重新创建了对象(让我们称之为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) c# ×9
.net ×5
performance ×2
deflate ×1
ilmerge ×1
json ×1
memorystream ×1
protobuf-net ×1
xml ×1