我正在使用RemotingServices.Marshal并Activator.GetObject在两台位于同一台计算机上的简单程序之间建立远程通道.
public class IpcInterface : MarshalByRefObject
{
public int number = -1;
public string text = "default";
public List<String> strings;
}
// A simplification
Run Code Online (Sandbox Code Playgroud)
我已经确认通道存在并且可以进行通信,因为两个程序都成功更改number并且text完全唯一的值(已确认).
所以我立即尝试做同样的事情strings.
在一个节目中,我打电话给strings.Add("1").我试着阅读strings第二个程序的内容.它是空的.更重要的是,伯爵是0.我不知道为什么strings继续有0对象,好像我从来没有添加它们.同样的事情发生了Stack<T>和Dictionary<T, K>,我只是不能将任何元素添加到它.为了确保通常没有引用奇怪的引用类型,我还尝试StringBuilder在IPC接口类中放置一个,并且在两个程序中成功维护"状态"以更改其值.
问题:为什么不添加字符串列表,解决方案是什么?
我希望有经验的人能马上发现这个问题.我尝试使用谷歌搜索类似的问题,但我没有得到任何有用的结果.令人惊讶的是,我只有一个很好的链接谷歌搜索" 调试.net远程透明代理 ".这也是我的第二个问题.如何调试透明代理对象?
我正在尝试创建一个Save/Load类,它具有保存和加载文件压缩文件的选项.以下是我到目前为止的情况.单步执行它似乎工作得很好,除了我得到"GZip标头中的幻数不正确"异常.我不明白这是怎么回事,因为我检查确保数字在我传递之前存在,并且我已经通过外部程序验证它是GZip文件.
任何协助找出我出错的地方将不胜感激.对我的代码的建设性批评总是受欢迎的 - 谢谢!
public static class SaveLoad
{
public static void Save(string fileName, object savefrom, bool compress)
{
FileStream stream = new FileStream(fileName, FileMode.Create);
BinaryFormatter formatter = new BinaryFormatter();
if (compress)
{
GZipStream compressor = new GZipStream(stream, CompressionMode.Compress);
formatter.Serialize(compressor, savefrom);
compressor.Close();
}
else { formatter.Serialize(stream, savefrom); }
stream.Close();
}
public static object Load(string fileName)
{
object loadedObject = null;
try
{
FileStream stream = new FileStream(fileName, FileMode.Open);
BinaryFormatter formatter = new BinaryFormatter();
if (stream.Length > 4)
{
byte[] data …Run Code Online (Sandbox Code Playgroud) 我将用户生成的文件从客户端发送到服务器。这些是序列化的类,然后由服务器读取。
根据我对上述链接的理解,这是危险的。但我尝试过发送一次性类,甚至尝试过实现 ISerilized 的类。但由于服务器不知道源程序集,两者都被拒绝。
[Serializable]
public class Ship : ISerializable
{
public Ship()
{
}
public Ship(SerializationInfo info, StreamingContext context)
{
Console.WriteLine("test");
}
public void GetObjectData(SerializationInfo info, StreamingContext context)
{
}
}
Run Code Online (Sandbox Code Playgroud)
那么客户端如何通过这个向量成功地将代码获取到我的服务器中呢?通过伪造命名空间名称和公钥导致服务器尝试反序列化它,从而运行上面的代码?还是有更微妙的方法来做到这一点?
不幸的是,这个功能是我游戏的核心基础,所以我要小心。
我使用BinaryFormatter将以下类序列化到一个文件中:
[Serializable]
public class TestClass
{
public String ItemTwo { get; set; }
public String ItemOne { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
使用此代码:
FileStream fs = new FileStream("DataFile.dat", FileMode.Create);
BinaryFormatter formatter = new BinaryFormatter();
formatter.Serialize(fs, new TestClass{ItemOne = "ItemOne", ItemTwo = "ItemTwo"});
fs.Close();
Run Code Online (Sandbox Code Playgroud)
使用此代码反序列化时:
FileStream fs = new FileStream("DataFile.dat", FileMode.Open);
BinaryFormatter formatter = new BinaryFormatter();
TestClass addresses = (TestClass)formatter.Deserialize(fs);
fs.Close();
Run Code Online (Sandbox Code Playgroud)
我得到一切正常.但是,现在我需要这个类有一些支持字段,如下所示:
[Serializable]
public class TestClass
{
private string _itemTwo;
private string _itemOne;
public String ItemTwo
{
get { return _itemTwo; } …Run Code Online (Sandbox Code Playgroud) 我们公司的解决方案之一消耗第三方服务.通过XML消息传递完成通信.在我们的最后,我们基于它们提供给我们的XML模式生成要使用的类,并且在某些时候我们将这些类型中的一些序列化为数据库中的二进制blob以供以后使用.
问题出现在第三方公司将其中一个字段从布尔值更改为整数类型的位置.现在,当我们尝试对已经存在的数据进行反序列化时,我们可以预见到会发生类型转换异常(无法从布尔值转换为整数).
我的问题是 - 我们如何使用旧的布尔类型反序列化我们数据库中的现有数据以将其转换为新的整数类型?
我已经尝试了很多东西 - 其中包括反思和实现ISerializable,但到目前为止还没有任何东西被淘汰.理想的解决方案是实现ISerializable,但是在尝试反序列化现有数据时遇到"未找到成员"错误,因为它已经仅使用Serializable属性进行了序列化.
欢迎任何建议!
编辑:添加一些代码以清楚地展示我的问题.
namespace ClassLibrary
{
[Serializable]
public class Foo //: ISerializable
{
public bool Bar { get; set; }
public Foo() { }
//[OnDeserializing()]
//internal void OnDeserializingMethod(StreamingContext context)
//{
// Bar = 10;
//}
//public Foo(SerializationInfo info, StreamingContext context)
//{
// Bar = (int)info.GetValue("Bar", typeof(int));
//}
//public void GetObjectData(SerializationInfo info, StreamingContext context)
//{
// info.AddValue("Bar", Bar);
//}
}
}
namespace ConsoleApplication2
{
static class Program
{
static void Main(string[] args)
{
Foo …Run Code Online (Sandbox Code Playgroud) 我有一个类在C#中处理序列化,称为Serializer.它的实现如下:
public class Serializer
{
public void SerializeRulesManager(string filename, RulesManager rulesManager)
{
Stream stream = File.Open(filename, FileMode.Create);
try
{
BinaryFormatter binaryFormatter = new BinaryFormatter();
binaryFormatter.Serialize(stream, rulesManager);
}
finally
{
stream.Close();
}
}
public RulesManager DeserializeRulesManager(string filename)
{
RulesManager rulesManager = null;
Stream stream = File.Open(filename, FileMode.Open);
try
{
BinaryFormatter binaryFormatter = new BinaryFormatter();
rulesManager = (RulesManager)binaryFormatter.Deserialize(stream);
}
finally
{
stream.Close();
}
return rulesManager;
}
}
Run Code Online (Sandbox Code Playgroud)
非常简单的东西,它适用于我的所有单元测试.RulesManager被正确序列化和反序列化,因此我知道图表是好的.
问题来自以下代码:
public void Save(string filename)
{
Cursor.Current = Cursors.WaitCursor;
try
{
_serializer.SerializeRulesManager(filename, _rulesManager);
} …Run Code Online (Sandbox Code Playgroud) 我肯定错过了一些非常明显的东西,但任何人都可以解释为什么在第二种情况下有更好的压缩率?!
案例1:压缩率非常低,有时甚至会增加尺寸.
using (var memoryStream = new System.IO.MemoryStream())
using (var gZipStream = new GZipStream(memoryStream, CompressionMode.Compress))
{
new BinaryFormatter().Serialize(gZipStream, obj);
gZipStream.Close();
return memoryStream.ToArray();
}
Run Code Online (Sandbox Code Playgroud)
案例2:更好的压缩,我没有得到规模增长.
using (MemoryStream msCompressed = new MemoryStream())
using (GZipStream gZipStream = new GZipStream(msCompressed, CompressionMode.Compress))
using (MemoryStream msDecompressed = new MemoryStream())
{
new BinaryFormatter().Serialize(msDecompressed, obj);
byte[] byteArray = msDecompressed.ToArray();
gZipStream.Write(byteArray, 0, byteArray.Length);
gZipStream.Close();
return msCompressed.ToArray();
}
Run Code Online (Sandbox Code Playgroud)
我已经完成了镜像解压缩,在这两种情况下我都可以将它反序列化为源对象而不会出现任何问题.
以下是一些统计数据:
UncSize:58062085B,Comp1:46828139B,0.81%
UncSize:58062085B,Comp2:31326029B,0.54%
UncSize:7624735B,Comp1:7743947B,1.02%
UncSize:7624735B,Comp2:5337522B,0.70%
UncSize:1237628B,Comp1:1265406B,1.02%
UncSize:1237628B,Comp2:921695B,0.74%
我是否可以避免向类中添加其他字段来存储仅用于反序列化/序列化所需的数据?
假设我有一些课程:
[Serializable]
class MyClass {
[NonSerialized]
NonSerializableDataType myField;
SomeOtherDataType serializableTemporaryData;
[OnSerializing]
OnSerializing (StreamingContext context) {
// build serializableTemporaryData from myField
}
[OnDeserialized]
void OnDeserialized (StreamingContext context) {
// build myField from serializableTemporaryData
}
}
Run Code Online (Sandbox Code Playgroud)
有没有办法避免serializableTemporaryData在每个对象中都有字段MyClass?例如,我可以将其设置为静态(可能通过更改我的On ...方法)吗?
约束:我无法改变执行NonSerializableDataType.
示例:假设myField包含资源的句柄.然后,在序列化时,我必须存储一些有关如何在反序列化后获取资源的信息,但我无法存储句柄本身.如果我换手柄扳到另一个类的话,我刚才转移问题的包装类 - 我要问的包装类非常相同的问题呢.
[Serializable]
class DOThis
{
private string _name;
public string Name
{
get { return _name; }
set { _name = value; }
}
public string Value
{
get
{
if (_name == "Hi")
return "Hey Hi";
else
return "Sorry I dont know you";
}
}
}
Run Code Online (Sandbox Code Playgroud)
我有上面的类使用BinaryFormatter序列化.下面是序列化代码,
DOThis obj = new DOThis();
obj.Name = "Ho";
BinaryFormatter bfm = new BinaryFormatter();
MemoryStream ms = new MemoryStream();
bfm.Serialize(ms, obj);
Run Code Online (Sandbox Code Playgroud)
这里如何忽略属性'Value'被序列化以及反序列化,因为我总是可以使用'Name'属性检索'Value'属性?
我正在尝试进行基本登录并注册 c# 控制台应用程序,但是,我需要遍历我的文件以查看用户在登录时输入的用户名和密码是否匹配。如果用户输入用户名和密码, 我希望我的代码通过我的文件来检查它是否是现有的用户名和密码
这是我的代码:
[Serializable]
public class Users
{
public string UserName;
public string Password;
public Users(string userName, string password)
{
UserName = userName;
Password = password;
}
}
public class SaveToFile
{
public static void SerializeSignUpDetails(string userName, string password)
{
Users obj = new Users(userName, password);
IFormatter formatter = new BinaryFormatter();
Stream stream = new FileStream("SignUp.txt", FileMode.Append, FileAccess.Write);
formatter.Serialize(stream, obj);
stream.Close();
}
public static Users DeserializeSignUpDetails()
{
Stream stream = new FileStream("SignUp.txt", FileMode.Open, FileAccess.Read);
IFormatter formatter = new …Run Code Online (Sandbox Code Playgroud) c# foreach serialization binaryformatter binary-serialization
binaryformatter ×10
c# ×10
.net ×1
blob ×1
compression ×1
foreach ×1
gzip ×1
gzipstream ×1
memorystream ×1
properties ×1
remoting ×1