gpt4 book ai didi

c# - 如何在 C# 中进行单例序列化?

转载 作者:行者123 更新时间:2023-12-02 01:17:22 25 4
gpt4 key购买 nike

我去MSDN搜索单例序列化,找到源码http://msdn.microsoft.com/en-us/library/system.runtime.serialization.serializationinfo.aspx但是当我更改部分代码时遇到了问题。我把它分成两个程序:序列化和反序列化。下面是两者的Main函数(其他类在msdn文档中,链接在第二行)。连载程序如下:

    public static void Main()
{
FileStream fs = new FileStream("DataFile.dat", FileMode.Create);

try
{
// Construct a BinaryFormatter and use it
// to serialize the data to the stream.
BinaryFormatter formatter = new BinaryFormatter();

// Create an array with multiple elements refering to
// the one Singleton object.
Singleton[] a1 = { Singleton.GetSingleton(), Singleton.GetSingleton() };

a1[0].SomeNumber = 555;

formatter.Serialize(fs, a1);

}
catch (SerializationException e)
{
Console.WriteLine("Failed to serialize. Reason: " + e.Message);
throw;
}
finally
{
fs.Close();
}
}

反序列化程序:

    public static void Main()
{
FileStream fs = new FileStream("DataFile.dat", FileMode.Open);

try
{
// Construct a BinaryFormatter and use it
// to serialize the data to the stream.
BinaryFormatter formatter = new BinaryFormatter();


Singleton[] a2 = (Singleton[]) formatter.Deserialize(fs);

// This displays "True".
Console.WriteLine(a2[0].SomeNumber);
}
catch (SerializationException e)
{
Console.WriteLine("Failed to serialize. Reason: " + e.Message);
throw;
}
finally
{
fs.Close();
}
}

我执行完这两个程序后,控制台打印的不是555,而是123,这是为什么呢?我无法弄清楚并陷入其中一整天,有人可以帮助我吗?

最佳答案

我相信您会在本文档中找到很多答案:IObjectReference

序列化 Singletons 从来都不是一件容易的事。但是您真的必须先序列化它们,然后反序列化它们吗?

这是我提供的 MSDN 链接中的代码示例:

using System;
using System.Web;
using System.IO;
using System.Collections;
using System.Runtime.Serialization.Formatters.Binary;
using System.Runtime.Serialization;
using System.Security.Permissions;


// There should be only one instance of this type per AppDomain.
[Serializable]
[PermissionSet(SecurityAction.Demand, Name="FullTrust")]
[AspNetHostingPermission(SecurityAction.LinkDemand,
Level=AspNetHostingPermissionLevel.Minimal)]
public sealed class Singleton : ISerializable
{
// This is the one instance of this type.
private static readonly Singleton theOneObject = new Singleton();

// Here are the instance fields.
private string someString_value;
private Int32 someNumber_value;

public string SomeString
{
get{return someString_value;}
set{someString_value = value;}
}

public Int32 SomeNumber
{
get{return someNumber_value;}
set{someNumber_value = value;}
}

// Private constructor allowing this type to construct the Singleton.
private Singleton()
{
// Do whatever is necessary to initialize the Singleton.
someString_value = "This is a string field";
someNumber_value = 123;
}

// A method returning a reference to the Singleton.
public static Singleton GetSingleton()
{
return theOneObject;
}

// A method called when serializing a Singleton.
[SecurityPermissionAttribute(SecurityAction.LinkDemand,
Flags=SecurityPermissionFlag.SerializationFormatter)]
void ISerializable.GetObjectData(
SerializationInfo info, StreamingContext context)
{
// Instead of serializing this object,
// serialize a SingletonSerializationHelp instead.
info.SetType(typeof(SingletonSerializationHelper));
// No other values need to be added.
}

// Note: ISerializable's special constructor is not necessary
// because it is never called.
}


[Serializable]
[PermissionSet(SecurityAction.Demand, Name="FullTrust")]
[SecurityPermissionAttribute(SecurityAction.LinkDemand,
Flags=SecurityPermissionFlag.SerializationFormatter)]
[AspNetHostingPermission(SecurityAction.LinkDemand,
Level=AspNetHostingPermissionLevel.Minimal)]
internal sealed class SingletonSerializationHelper : IObjectReference
{
// This object has no fields (although it could).

// GetRealObject is called after this object is deserialized.
public Object GetRealObject(StreamingContext context)
{
// When deserialiing this object, return a reference to
// the Singleton object instead.
return Singleton.GetSingleton();
}
}


class App
{
[STAThread]
static void Main()
{
FileStream fs = new FileStream("DataFile.dat", FileMode.Create);

try
{
// Construct a BinaryFormatter and use it
// to serialize the data to the stream.
BinaryFormatter formatter = new BinaryFormatter();

// Create an array with multiple elements refering to
// the one Singleton object.
Singleton[] a1 = { Singleton.GetSingleton(), Singleton.GetSingleton() };

// This displays "True".
Console.WriteLine(
"Do both array elements refer to the same object? " +
(a1[0] == a1[1]));

// Serialize the array elements.
formatter.Serialize(fs, a1);

// Deserialize the array elements.
fs.Position = 0;
Singleton[] a2 = (Singleton[]) formatter.Deserialize(fs);

// This displays "True".
Console.WriteLine("Do both array elements refer to the same object? "
+ (a2[0] == a2[1]));

// This displays "True".
Console.WriteLine("Do all array elements refer to the same object? "
+ (a1[0] == a2[0]));
}
catch (SerializationException e)
{
Console.WriteLine("Failed to serialize. Reason: " + e.Message);
throw;
}
finally
{
fs.Close();
}
}
}

关于c# - 如何在 C# 中进行单例序列化?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9586682/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com