Agn*_*ian 12 .net c# serialization binary-serialization
鉴于这样一个类:
[Serializable]
public class MyClass {
string name;
string address;
public MyClass(SerializationInfo info, StreamingContext context){
name = info.GetString("name");
if(/* todo: check if a value for address exists */)
address = info.GetString("address");
}
public void GetObjectData(SerializationInfo info, StreamingContext context){
info.AddValue(name);
if(address != null)
info.AddValue(address);
}
}
Run Code Online (Sandbox Code Playgroud)
如何address在调用之前测试字段的值是否存在info.GetString(address)?
是的,我确实理解我可以简单地写一个空address字段,但我真正的问题是早期版本的MyClass,没有地址字段.
注意:我有充分的理由使用自定义序列化.有一些静态字段被用作单例,默认的反序列化不会尊重它.
Mar*_*ell 16
好吧,一个有趣的方法是你可以使用GetEnumerator(foreach)迭代名称/值对,使用switch名称依次处理每个?
但实施似乎有点不标准; 从这里的例子:
SerializationInfoEnumerator e = info.GetEnumerator();
Console.WriteLine("Values in the SerializationInfo:");
while (e.MoveNext())
{
Console.WriteLine("Name={0}, ObjectType={1}, Value={2}",
e.Name, e.ObjectType, e.Value);
}
Run Code Online (Sandbox Code Playgroud)
但看起来你也可以使用SerializationEntry:
[Serializable]
class MyData : ISerializable
{
public string Name { get; set; }
public int Value { get; set; }
public MyData() { }
public MyData(SerializationInfo info, StreamingContext context)
{
foreach (SerializationEntry entry in info)
{
switch (entry.Name)
{
case "Name":
Name = (string)entry.Value; break;
case "Value":
Value = (int)entry.Value; break;
}
}
}
public void GetObjectData(SerializationInfo info, StreamingContext context)
{
info.AddValue("Name", Name);
info.AddValue("Value", Value);
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3654 次 |
| 最近记录: |