Skip to content

Commit 882d5e8

Browse files
authored
Merge pull request #7 from coryleach/dev
Object Copy Implemented.
2 parents fda24ea + f63c320 commit 882d5e8

11 files changed

+163
-5
lines changed

README.md

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
<h1 align="center">Gameframe.SaveLoad 👋</h1>
22
<p>
3-
<img alt="Version" src="https://img.shields.io/badge/version-1.0.3-blue.svg?cacheSeconds=2592000" />
3+
<img alt="Version" src="https://img.shields.io/badge/version-1.0.4-blue.svg?cacheSeconds=2592000" />
44
<a href="https://twitter.com/Cory Leach">
55
<img alt="Twitter: coryleach" src="https://img.shields.io/twitter/follow/coryleach.svg?style=social" target="_blank" />
66
</a>
@@ -13,15 +13,15 @@ Serialization helper utility that supports save, load and encryption.
1313
#### Using UnityPackageManager (for Unity 2019.3 or later)
1414
Open the package manager window (menu: Window > Package Manager)<br/>
1515
Select "Add package from git URL...", fill in the pop-up with the following link:<br/>
16-
https://github.com/coryleach/UnitySaveLoad.git#1.0.3<br/>
16+
https://github.com/coryleach/UnitySaveLoad.git#1.0.4<br/>
1717

1818
#### Using UnityPackageManager (for Unity 2019.1 or later)
1919

2020
Find the manifest.json file in the Packages folder of your project and edit it to look like this:
2121
```js
2222
{
2323
"dependencies": {
24-
"com.gameframe.saveload": "https://github.com/coryleach/UnitySaveLoad.git#1.0.3",
24+
"com.gameframe.saveload": "https://github.com/coryleach/UnitySaveLoad.git#1.0.4",
2525
...
2626
},
2727
}

Runtime/ISerializationMethod.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ public interface ISerializationMethod
99
{
1010
void Save(object savedObject, FileStream fileStream);
1111
object Load(System.Type savedObjectType, FileStream fileStream);
12+
object Copy(object copyObject);
1213
}
1314
}
1415

Runtime/SaveLoadManager.cs

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -73,6 +73,29 @@ public void Save(object obj, string filename, string folder = null)
7373
var saveLoadMethod = GetSaveLoadMethod(saveMethod);
7474
SaveLoadUtility.Save(obj,saveLoadMethod,filename,folder, baseFolder);
7575
}
76+
77+
/// <summary>
78+
/// Creat a copy of an object by serializing and deserializing it
79+
/// </summary>
80+
/// <param name="obj">object to be copied</param>
81+
/// <returns>duplicated instance</returns>
82+
public object Copy(object obj)
83+
{
84+
var saveLoadMethod = GetSaveLoadMethod(saveMethod);
85+
return saveLoadMethod.Copy(obj);
86+
}
87+
88+
/// <summary>
89+
/// Creat a copy of an object by serializing and deserializing it
90+
/// </summary>
91+
/// <param name="obj">object to be copied</param>
92+
/// <typeparam name="T">Type of object to be copied.</typeparam>
93+
/// <returns>duplicated instance</returns>
94+
public T Copy<T>(T obj)
95+
{
96+
var saveLoadMethod = GetSaveLoadMethod(saveMethod);
97+
return (T)saveLoadMethod.Copy(obj);
98+
}
7699

77100
/// <summary>
78101
/// Load an object from disk

Runtime/SerializationMethodBinary.cs

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,18 @@ public object Load(Type savedObjectType, FileStream fileStream)
3232
loadedObj = formatter.Deserialize(fileStream);
3333
return loadedObj;
3434
}
35+
36+
public object Copy(object copyObject)
37+
{
38+
using (var stream = new MemoryStream())
39+
{
40+
var formatter = new BinaryFormatter();
41+
formatter.Serialize(stream, copyObject);
42+
stream.Position = 0;
43+
return formatter.Deserialize(stream);
44+
}
45+
}
46+
3547
}
3648
}
3749

Runtime/SerializationMethodBinaryEncrypted.cs

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,17 @@ public void SetEncryption(string key, string salt)
5858
_key = key;
5959
_salt = salt;
6060
}
61+
62+
public object Copy(object copyObject)
63+
{
64+
using (var stream = new MemoryStream())
65+
{
66+
var formatter = new BinaryFormatter();
67+
formatter.Serialize(stream, copyObject);
68+
stream.Position = 0;
69+
return formatter.Deserialize(stream);
70+
}
71+
}
6172
}
6273
}
6374

Runtime/SerializationMethodJsonDotNet.cs

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,26 @@ public object Load(Type savedObjectType, FileStream fileStream)
3131

3232
return loadedObj;
3333
}
34+
35+
public object Copy(object copyObject)
36+
{
37+
using (var stream = new MemoryStream())
38+
{
39+
var writeJson = JsonConvert.SerializeObject(copyObject);
40+
41+
var streamWriter = new StreamWriter(stream);
42+
streamWriter.Write(writeJson);
43+
streamWriter.Flush();
44+
45+
stream.Position = 0;
46+
47+
using (var streamReader = new StreamReader(stream))
48+
{
49+
var readJson = streamReader.ReadToEnd();
50+
return JsonConvert.DeserializeObject(readJson, copyObject.GetType());
51+
}
52+
}
53+
}
3454
}
3555
}
3656

Runtime/SerializationMethodJsonDotNetEncrypted.cs

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,27 @@ public void SetEncryption(string key, string salt)
6666
_key = key;
6767
_salt = salt;
6868
}
69+
70+
public object Copy(object copyObject)
71+
{
72+
using (var stream = new MemoryStream())
73+
{
74+
var writeJson = JsonConvert.SerializeObject(copyObject);
75+
76+
var streamWriter = new StreamWriter(stream);
77+
streamWriter.Write(writeJson);
78+
streamWriter.Flush();
79+
80+
stream.Position = 0;
81+
82+
using (var streamReader = new StreamReader(stream))
83+
{
84+
var readJson = streamReader.ReadToEnd();
85+
return JsonConvert.DeserializeObject(readJson, copyObject.GetType());
86+
}
87+
}
88+
}
89+
6990
}
7091
}
7192

Runtime/SerializationMethodUnityJson.cs

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,27 @@ public object Load(Type savedObjectType, FileStream fileStream)
3030

3131
return loadedObj;
3232
}
33+
34+
public object Copy(object copyObject)
35+
{
36+
using (var stream = new MemoryStream())
37+
{
38+
var writeJson = JsonUtility.ToJson(copyObject);
39+
var streamWriter = new StreamWriter(stream);
40+
streamWriter.Write(writeJson);
41+
streamWriter.Flush();
42+
43+
stream.Position = 0;
44+
45+
using (var streamReader = new StreamReader(stream))
46+
{
47+
var readJson = streamReader.ReadToEnd();
48+
streamReader.Close();
49+
return JsonUtility.FromJson(readJson, copyObject.GetType());
50+
}
51+
}
52+
}
53+
3354
}
3455
}
3556

Runtime/SerializationMethodUnityJsonEncrypted.cs

Lines changed: 22 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ public SerializationMethodUnityJsonEncrypted(string key, string salt)
1616

1717
public void Save(object savedObject, FileStream fileStream)
1818
{
19-
//TODO: Using Unity's json serializer... does not support dictionaries. Do better.
19+
//Note: Use JsonDotNet method for Dictionary serialization
2020
var json = JsonUtility.ToJson(savedObject);
2121
using (var memoryStream = new MemoryStream())
2222
{
@@ -64,6 +64,27 @@ public void SetEncryption(string key, string salt)
6464
_key = key;
6565
_salt = salt;
6666
}
67+
68+
public object Copy(object copyObject)
69+
{
70+
using (var stream = new MemoryStream())
71+
{
72+
var writeJson = JsonUtility.ToJson(copyObject);
73+
var streamWriter = new StreamWriter(stream);
74+
streamWriter.Write(writeJson);
75+
streamWriter.Flush();
76+
77+
stream.Position = 0;
78+
79+
using (var streamReader = new StreamReader(stream))
80+
{
81+
var readJson = streamReader.ReadToEnd();
82+
streamReader.Close();
83+
return JsonUtility.FromJson(readJson, copyObject.GetType());
84+
}
85+
}
86+
}
87+
6788
}
6889
}
6990

Tests/Runtime/SaveLoadManagerTests.cs

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -113,6 +113,34 @@ public void CanSaveAndLoad([Values] SerializationMethodType method)
113113
Object.Destroy(manager);
114114
}
115115

116+
[Test]
117+
public void CanCopy([Values] SerializationMethodType method)
118+
{
119+
var manager = CreateManager(method);
120+
121+
var testObject = new SaveLoadTestObject()
122+
{
123+
listOfStrings = new List<string> {"one", "two"},
124+
count = 10,
125+
};
126+
127+
var loadedObject = manager.Copy(testObject);
128+
129+
Assert.NotNull(loadedObject);
130+
Assert.IsFalse(ReferenceEquals(testObject,loadedObject));
131+
Assert.NotNull(loadedObject.listOfStrings);
132+
Assert.IsTrue(loadedObject.listOfStrings.Count == testObject.listOfStrings.Count);
133+
134+
for (int i = 0; i < testObject.listOfStrings.Count; i++)
135+
{
136+
Assert.IsTrue(testObject.listOfStrings[i] == loadedObject.listOfStrings[i]);
137+
}
138+
139+
Assert.IsTrue(testObject.count == loadedObject.count);
140+
141+
Object.Destroy(manager);
142+
}
143+
116144
[Test]
117145
public void LoadReturnsNullWhenFileDoesnotExist([Values] SerializationMethodType method)
118146
{

0 commit comments

Comments
 (0)